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

巴扎黑
發布: 2023-03-15 11:10:02
原創
2992 人瀏覽過

最近在學習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)
{
 //
});
登入後複製

注意:获取到的对象将会传入回调函数中。

以上是Laravel框架中IOC容器的用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!