在laravel中,想要把服務綁定到容器一般是用下面的方法,在服務提供者中,常見類似的寫法,第一個參數傳標識,第二個參數傳閉包
但是在 bootstrap/app.php 中有三行代碼是這麼寫的,第一個參數傳了一個契約(接口),第二個參數傳了一個具體類
問:爲什麼要這麼寫呢? 答:爲了在依賴注入時,實現解耦
舉個例子:
如果需要在控制器中調用自己寫的工具類,比如處理字符串的,如何調用呢?
創建一個文件 app/Tools/StringTools.php 注:Tools目錄也是自己建的,隨便建個啥目錄都行,只是爲了方便管理
在控制器中調用,正常引入,依賴注入,就可以用了
但是,如果後來處理字符串的工具類換了呢?比如換成了StringUnit類,那就得改這個Template控制器了,像下圖這樣
如果,之前引入StringTools類的有100個控制器文件呢?挨個改,想想都覺得刺激 ⊙▽⊙.有別的方法嗎?有!
1,建一個 app/Contracts/Tools.php 文件,這是個接口文件
2,在 app/Tools/StringTools.php 類中,實現 Tools接口
3,在 app/Providers/AppServiceProvider.php 文件的 register 方法中,進行綁定
4,在控制器中,注入接口,而不是直接注入StringTools類
這時,如果需要把StringTools類換成StringUnit類就很簡單了
1,新建StringUnit類,並實現Tools接口
2,更改 app/Providers/AppServiceProvider.php 文件的 register 方法,搞定! ^_^
在 bootstrap/app.php 中的那三個綁定,就是幹這個用的