啥都不說,直接上代碼php
<?php class UserController { private $user; function __construct(UserModel $user) { $this->user = $user; } } $user = new UserController(new UserMonel()); ?>
User控制器依賴UserModel,實例化的時候,直接注入。html
先說IOC和DI的區別吧!laravel
因此二者有本質上的區別。DI是IOC的一種實現方法(還有ServiceLocator等其餘設計模式)。 所謂的反轉,主要指由 主動依賴 到 被動依賴 。設計模式
//主動依賴 function __construct() { $this->user = new UserModel(); } //被動依賴 function __construct(UserModel $user) { $this->user = $user; }
參考 淺談IOC--說清楚IOC是什麼架構
IOC容器 是Laravel的核心設計模式,對於laravel的應用和理解是很是有必要深刻學習的!app
IOC思想實現了高度解耦,那麼,問題來了,如何管理這些分散的模塊呢?這就是容器的任務了!ide
能夠想象成,在IOC容器中,裝着(註冊)不少模塊。當用戶須要一個模塊的時候,能夠從中拿出來。當提取的模塊依賴另外一個模塊的時候,容器會自動注入,再返回給用戶(反射機制實現)。函數
是否是碉堡了?大批互相依賴的模塊被完美解耦並統一管理了!學習
假設模塊一多,那麼容器不是愈來愈大?每次加載,豈不是加載很久? 能不能弄一條管子,鏈接着模塊,插在容器上,須要再經過管道獲取呢?這樣子,容器只是裝着管頭而已,就不怕被撐大了!this
這條管子就是 服務提供者。
服務提供者自己也是一個類,不過這個類只有啓動和註冊兩個函數。
/** * Bootstrap the application services. * * @return void */ public function boot() { // } /** * Register the application services. * * @return void */ public function register() { //綁定到容器 $this->app->singleton( 'Riak\Contracts\Connection', function ($app) { return new Connection($app['config']['riak']); } ); }
服務提供者在config/app.php中配置,laravel自動註冊到容器中。
'providers' => [ /* * Laravel Framework Service Providers... */ Illuminate\Auth\AuthServiceProvider::class, Illuminate\Broadcasting\BroadcastServiceProvider::class, ... /* * Application Service Providers... */ app\Providers\AppServiceProvider::class, app\Providers\AuthServiceProvider::class, ... ]
程序猿老是偷懶的,每次要模塊,都要去容器裏面拿,多麻煩啊!找我的代拿行不?這送貨小哥就叫Facade門面。文檔中叫靜態代理。
送貨小哥都是在config/app.php 中註冊的。
'aliases' => [ 'App' => Illuminate\Support\Facades\App::class, 'Config' => Illuminate\Support\Facades\Config::class, 'Cookie' => Illuminate\Support\Facades\Cookie::class, 'Crypt' => Illuminate\Support\Facades\Crypt::class, 'DB' => Illuminate\Support\Facades\DB::class, 'Route' => Illuminate\Support\Facades\Route::class, ... ],
查看Illuminate\Support\Facades\Route代碼,能夠發現只有getAccessFacade()方法,這就是交代送啥貨的函數,繼承了Facade這個小哥基類。
class Route extends Facade { /** * Get the registered name of the component. * * @return string */ protected static function getFacadeAccessor() { return 'router'; } }
註冊了Facade門面後,就能夠在任意地方使用了!
文檔有詳細的使用方式 Laravel 架構 — Facades。
不難發現,在引導程序開始初始化的時候,也就是在boostrap\app.php文件,裏面一來就new了一個 Illuminate\Foundation\Application。下面分別註冊了 Http\Kernel、Console\Kernel、Exceptions\Handler等。
這裏能夠這麼理解,new一個Application,能夠看做是創造了一個空間,這個空間初始化的時候,就會爲本身注入一個容器,也就是在空間中放了一個容器。
在 Illuminate\Foundation\Application.php 中的 registerBaseBindings() 函數能夠查看到容器注入源碼。
至於kernel,能夠當作是這個空間的工人,有各類各樣的工人,每一個工人都有本身的工做。比如HttpKernel,負責處理http請求以及控制整個請求流程。