《PHP教程:Laravel學習教程之IOC容器的介紹與用例》要點:
本文介紹了PHP教程:Laravel學習教程之IOC容器的介紹與用例,希望對您有用。如果有疑問,可以聯系我們。
前言PHP實戰
Laravel使用IoC(Inversion of Control,控制倒轉,這是一個設計模式,可以先查看下百科)容器這個強有力的工具管理類依賴.依賴注入(也是一種設計模式,一般用于實現IoC)是一個不用編寫固定代碼來處理類之間依賴的方法,相反的,這些依賴是在運行時注入的,這樣允許處理依賴時具有更大的靈活性.PHP實戰
理解 Laravel IoC容器是構建強大應用程序所必要的,也有助于Laravel 核心本身.下面話不多說了,來一起看看詳細的介紹吧.PHP實戰
基本用例PHP實戰
綁定一個類型到容器PHP實戰
IoC 容器有兩種方法來解決依賴關系:通過閉包回調或者自動解析.首先,我們來探究一下閉包回調.首先,需要綁定一個“類型”到容器中:PHP實戰
App::bind('foo', function($app) { return new FooBar; });
從容器中取得一個類型PHP實戰
$value = App::make('foo');
當執行 App::make
方法,閉包函數被執行并返回結果.PHP實戰
綁定一個”共享“類型到容器PHP實戰
有時,你只想將綁定到容器的類型處理一次,然后接下來從容器中取得的都應該是相同實例:PHP實戰
App::singleton('foo', function() { return new FooBar; });
綁定一個已經存在的類型實例到容器PHP實戰
你也可以使用instance方法,將一個已經存在的對象接口綁定到容器中:PHP實戰
$foo = new Foo; App::instance('foo', $foo);
哪里去注冊綁定呢PHP實戰
IoC綁定,很像事件句柄或者路由過濾,通常在"bootstrap code(引導代碼)"之后完成.換句話說,它們在你的應用程序準備處理請求,也即是在一個路由或者控制器被實際執行之前執行.和其他引導代碼一樣,start文件通常作為IoC綁定注冊一種方法.另外,你可以創建一個app/ioc.php(文件名不一定一樣)文件,并在start文件中包含它.PHP實戰
如果你的應用程序有很大量IoC綁定,或者你想根據不同的分類將IoC綁定分割到不同的文件,你可以嘗試在服務提供器(見下面)中進行綁定PHP實戰
自動解析PHP實戰
取得一個類PHP實戰
IoC容器足夠強大,在許多場景下不需要任何配置就能取得類.例如PHP實戰
class FooBar { public function __construct(Baz $baz) { $this->baz = $baz; } } $fooBar = App::make('FooBar');
注意:我們雖然沒有在容器中注冊FooBar類,容器仍然可以取得該類,甚至自動注入Baz依賴!PHP實戰
當某個類型沒有綁定到容器,IoC容器將使用 PHP 的反射工具來檢查類和讀取構造器的類型提示.使用這些信息,容器可以自動構建類實例.PHP實戰
綁定一個接口實現PHP實戰
然而,在某些情況下,一個類可能依賴某個接口實現,而不是一個 “具體的類”.當在這種情況下,App::bind
方法必須通知容器注入哪個接口實現:PHP實戰
App::bind('UserRepositoryInterface', 'DbUserRepository');
現在考慮下這個控制器:PHP實戰
class UserController extends BaseController { public function __construct(UserRepositoryInterface $users) { $this->users = $users; } }
由于我們將 UserRepositoryInterface 綁定了具體類,DbUserRepository 在該控制器創建時將會被自動注入到該控制器.PHP實戰
實際用例PHP實戰
Laravel 提供了幾個方法使用 IoC 容器增強應用程序可擴展性和可測試性.一個主要的例子是取得控制器.所有控制器都通過 IoC 容器取得,意味著可以在控制器構造方法中對依賴的類型提示,它們將自動被注入.PHP實戰
對控制器的依賴關系做類型提示PHP實戰
class OrderController extends BaseController { public function __construct(OrderRepository $orders) { $this->orders = $orders; } public function getIndex() { $all = $this->orders->all(); return View::make('orders', compact('all')); } }
在這個例子中,OrderRepository 將會自動注入到控制器.意味著當 單元測試 模擬請求時,OrderRepository 將會綁定到容器以及注入到控制器中,允許無痛與數據庫層交互.PHP實戰
IoC 使用的其他例子PHP實戰
過濾器, composers, 和 事件句柄也能夠從IoC容器中獲取到.當注冊它們的時候,只需要把它們使用的類名簡單給出即可:PHP實戰
Route::filter('foo', 'FooFilter'); View::composer('foo', 'FooComposer'); Event::listen('foo', 'FooHandler');
服務提供器PHP實戰
服務器提供器是將一組相關 IoC 注冊到單一路徑的有效方法.將它們看做是一種引導組件的方法.在服務器提供器里,你可以注冊自定義的驗證驅動器,使用 IoC 容器注冊應用程序倉庫類,甚至是自定義 Artisan 命令.PHP實戰
事實上,大多數核心 Laravel 組件包含服務提供器.應用程序所有注冊在服務提供器的均列在? app/config/app.php 配置文件的 providers 數組中.PHP實戰
定義服務提供器PHP實戰
要創建服務提供器,只需繼承 Illuminate\Support\ServiceProvider 類并且定義一個 register 方法:PHP實戰
use Illuminate\Support\ServiceProvider; class FooServiceProvider extends ServiceProvider { public function register() { $this->app->bind('foo', function() { return new Foo; }); } }
注意:在 register 方法,應用程序通過 $this->app 屬性訪問 IoC 容器.一旦你已經創建了提供器并且想將它注冊到應用程序中, 只需簡單的放入 app 配置文件里 providers 數組中.PHP實戰
運行時注冊服務提供器PHP實戰
你也可以使用 App::register
方法在運行時注冊服務提供器:PHP實戰
App::register('FooServiceProvider');
容器事件PHP實戰
注冊獲取事件監聽者PHP實戰
容器在每次獲取對象時都觸發一個事件.你可以通過使用 resolving 方法來監聽該事件:PHP實戰
App::resolvingAny(function($object) { // }); App::resolving('foo', function($foo) { // });
注意:獲取到的對象將會傳入回調函數中.PHP實戰
譯者:mpandar(馬勝盼)PHP實戰
總結PHP實戰
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持.PHP實戰
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/304.html