分為如下兩部分:
-
依賴注入
-
依賴注入其實本質上是指對類的依賴通過構造器完成自動注入;
-
在控制器架構方法和操作和方法中一旦對參數進行對象類型約束則會自動觸發依賴注入,由於訪問控制器的參數都來自於 URL 請求,普通變量就是通過參數綁定自動獲取,對象變量則是通過依賴注入生成。
-
案例:
// 模型層 One namespace app\model; use think\Model; class One extends Model { public $username = 'laowen'; } // 控制器 namespace app\controller; use app\model\One; class TestOne { protected $one; public function __construct(One $one) { $this->one = $one; } public function index() { return $this->one->username; } }
-
依賴注入:即允許通過類的方法傳遞對象的能力,並且限制了對象的類型(約束);
-
而傳遞的對象背后的那個類被自動綁定並且實例化了,這就是依賴注入;
-
支持使用依賴注入的場景包括(但不限於):
- 控制器架構方法;
- 控制器操作方法;
- 路由的閉包定義;
- 事件類的執行方法;
- 中間件的執行方法;
-
-
容器
-
依賴注入的類統一由容器管理的,大多數情況下是自動綁定和自動實例化的;
-
如果想手動來完成綁定和實例化,可以使用bind()和app()助手函數來實現;
class TestTwo { public function bind() { bind('one', 'app\model\One'); return app('one')->username; } } // bind('one' ,'...')綁定類庫標識,這個標識具有唯一性,以便快速調用; // app('one') 快速調用,並自動實例化對象,標識嚴格保持一致包括大小寫;
-
自動實例化對象的方式,是采用單例模式實現,如果想重新實例化一個對象,則:
class TestTwo { public function bind() { bind('one', 'app\model\One'); // 每次調用總是會重新實例化 return app('one',[], true)->username; // app()中第二參數,方法實例化對象的時候,傳遞參數; // 模型層通過構造函數來接收數據 // $one = app('one', [['test']], true); // return $one->username; } }
-
通過 app() 綁定一個類到容器中並自動實例化;
class TestTwo { public function bind() { return app('app\model\One')->username; } }
-
批量綁定到容器中
public function bind() { bind([ 'one' => 'app\model\One', 'user' => 'app\model\User' ]); // bind([ // 'one' => \app\model\One::class, // 'user' => \app\model\User::class // ]); // ::class 模式,不需要單引號; // 而是需要在最前面加上\,之前的加不加都行; return app('one')->username; }
-
系統提供了 provider.php 文件,用於批量綁定類到容器中;
-
系統內置了很多常用的類庫,以便開發者快速調用;
-