Laravel架構中IOC容器的用法詳解

來源:互聯網
上載者:User
最近在學習laravel,正好學習到了ioc容器,但發現網上這方面的資料較少,所以將自己學習的總結下,下面這篇文章主要給大家介紹了關於Laravel學習教程之IOC容器的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

Laravel使用IoC(Inversion of Control,控制倒轉,這是一個設計模式,可以先查看下百科)容器這個強有力的工具管理類依賴。依賴注入(也是一種設計模式,一般用於實現IoC)是一個不用編寫固定代碼來處理類之間依賴的方法,相反的,這些依賴是在運行時注入的,這樣允許處理依賴時具有更大的靈活性。

理解 Laravel IoC容器是構建強大應用程式所必要的,也有助於Laravel 核心本身。下面話不多說了,來一起看看詳細的介紹吧。

基本用例

綁定一個類型到容器

IoC 容器有兩種方法來解決依賴關係:通過閉包回調或者自動解析。首先,我們來探究一下閉包回調。首先,需要綁定一個“類型”到容器中:


App::bind('foo', function($app){ return new FooBar;});

從容器中取得一個類型


$value = App::make('foo');

當執行 App::make 方法,閉包函數被執行並返回結果。

綁定一個”共用“類型到容器

有時,你只想將綁定到容器的類型處理一次,然後接下來從容器中取得的都應該是相同執行個體:


App::singleton('foo', function(){ return new FooBar;});

綁定一個已經存在的類型執行個體到容器

你也可以使用instance方法,將一個已經存在的對象介面綁定到容器中:


$foo = new Foo;App::instance('foo', $foo);

哪裡去註冊綁定呢

IoC綁定,很像事件控制代碼或者路由過濾,通常在"bootstrap code(引導代碼)"之後完成。換句話說,它們在你的應用程式準備處理請求,也即是在一個路由或者控制器被實際執行之前執行。和其他引導代碼一樣,start檔案通常作為IoC綁定註冊一種方法。另外,你可以建立一個app/ioc.php(檔案名稱不一定一樣)檔案,並在start檔案中包含它。

如果你的應用程式有很大量IoC綁定,或者你想根據不同的分類將IoC綁定分割到不同的檔案,你可以嘗試在服務提供器(見下面)中進行綁定

自動解析

取得一個類

IoC容器足夠強大,在許多情境下不需要任何配置就能取得類。例如


class FooBar { public function __construct(Baz $baz) {  $this->baz = $baz; }}$fooBar = App::make('FooBar');

注意:我們雖然沒有在容器中註冊FooBar類,容器仍然可以取得該類,甚至自動注入Baz依賴!

當某個類型沒有綁定到容器,IoC容器將使用 PHP 的反射工具來檢查類和讀取構造器的類型提示。使用這些資訊,容器可以自動構建類執行個體。

綁定一個介面實現

然而,在某些情況下,一個類可能依賴某個介面實現,而不是一個 “具體的類”。當在這種情況下,App::bind方法必須通知容器注入哪個介面實現:


App::bind('UserRepositoryInterface', 'DbUserRepository');

現在考慮下這個控制器:


class UserController extends BaseController { public function __construct(UserRepositoryInterface $users) {  $this->users = $users; }}

由於我們將 UserRepositoryInterface 綁定了具體類,DbUserRepository 在該控制器建立時將會被自動注入到該控制器。

實際用例

Laravel 提供了幾個方法使用 IoC 容器增強應用程式可擴充性和可測試性。一個主要的例子是取得控制器。所有控制器都通過 IoC 容器取得,意味著可以在控制器構造方法中對依賴的類型提示,它們將自動被注入。

對控制器的依賴關係做類型提示


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 將會綁定到容器以及注入到控制器中,允許無痛與資料庫層互動。

IoC 使用的其他例子

過濾器, composers, 和 事件控制代碼也能夠從IoC容器中擷取到。當註冊它們的時候,只需要把它們使用的類名簡單給出即可:


Route::filter('foo', 'FooFilter');View::composer('foo', 'FooComposer');Event::listen('foo', 'FooHandler');

服務提供器

伺服器提供器是將一組相關 IoC 註冊到單一路徑的有效方法。將它們看做是一種引導組件的方法。在伺服器提供器裡,你可以註冊自訂的驗證磁碟機,使用 IoC 容器註冊應用程式倉庫類,甚至是自訂 Artisan 命令。

事實上,大多數核心 Laravel 組件包含服務提供器。應用程式所有註冊在服務提供器的均列在 app/config/app.php 設定檔的 providers 數組中。

定義服務提供器

要建立服務提供器,只需繼承 Illuminate\Support\ServiceProvider 類並且定義一個 register 方法:


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 數組中。

運行時註冊服務提供器

你也可以使用 App::register 方法在運行時註冊服務提供器:


App::register('FooServiceProvider');

容器事件

註冊擷取事件監聽者

容器在每次擷取對象時都觸發一個事件。你可以通過使用 resolving 方法來監聽該事件:


App::resolvingAny(function($object){ //});App::resolving('foo', function($foo){ //});

注意:擷取到的對象將會傳入回呼函數中。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.