聲明:這是看官方文檔寫的筆記,可以說是抄了一遍吧,加深印象和加深理解。
======================================================================================================
容器和依賴注入
_________________________________________________________________________________________________________________________________________
ThinkPHP使用容器來更方便得管理類依賴以及運行依賴注入,新版的容器支持PSR-11規范。
容器類的工作由 think\Container 類完成,但大多數情況我們只需要通過 app 助手函數或者 think\App 類即可容器操作,如果在服務類中可以直接調用 this->app 進行容器操作。
依賴注入其本質上指對類的依賴通過構造器完成自動注入,例如在控制器架構方法和操作方法中一旦對參數進行對象類型約束則會自動觸發依賴注入,由於訪問控制器的參數都來自於URL請求,普通變量就是通過參數綁定自動獲取,對象變量則是通過依賴注入生成。
<?php
namespace app\controller;
use think\Request;
class Index
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function hello($name)
{
return 'Hello,' . $name . '!This is ' . $this->request->action();
}
}
依賴注入的對象可以支持多個,並且和順序無關。
支持使用依賴注入的場景包括(但不限於):
- 控制器架構方法;
- 控制器操作方法;
- 路由的閉包定義;
- 事件類的執行方法;
- 中間件的執行方法;
對於自定義的類以及方法,如果需要使用依賴注入,需要使用系統提供的 invoke 助手函數調用,例如:
class Foo
{
public function __construct(Bar $bar)
{
}
}
如果直接 new 的話,需要手動傳入 Bar 對象實例
$bar = new Bar();
$foo = new Foo($bar);
如果使用容器來實例化的話,可以自動進行依賴注入。
$foo = invoke('Foo');
如果要對某個方法支持依賴注入,可以使用
class Foo
{
public function bar(Bar $bar)
{
}
}
$result = invoke(['Foo','bar']);
也支持對某個函數或閉包使用依賴注入
$result = invoke(function (Bar $bar){
});
_________________________________________________________________________________________________________________________________________
綁定
_________________________________________________________________________________________________________________________________________
依賴注入的類統一由容器進行管理,大多數情況下是在自動綁定並且實例化的。不過你可以隨時進行手動綁定類到容器中(通常是在服務類的 register 方法中進行綁定),支持多種綁定方式。
綁定標識
可以對已有的類庫綁定一個標識(唯一),便於快速調用。
// 綁定類庫標識
$this->app->bind('think\Cache','app\common\Cache');
或者使用助手函數
// 綁定類庫標識
bind('cache','think\Cache');
綁定類標識可以自己定義(只要不沖突)
綁定閉包
可以綁定一個閉包到容器中
bind('sayHello',function ($name){
return 'hello,' . $name;
});
綁定實例
也可以直接綁定一個類的實例
$cache = new think\Cache;
// 綁定類實例
bind('cache',$cache);
綁定至接口實現
對於依賴注入使用接口類的情況,我們需要告訴系統使用哪個具體的接口實現類來,不寫了,犯困!