最近小俠在和公司的小夥伴奮鬥在開發的最前線。什麼是最前線?大概中秋我們團隊就只休息了24號,其他時間?抱歉乖乖地完成專案和趕進度吧。前些天,在關注專案進度的時候看到了同事在看laravel 的服務提供的相關問題,於是趕緊去八卦打聽(ps:說白了就是八卦下看看有什麼新技術可以看看,畢竟不斷學習才是我們根本的進步捷徑)。原來是公司,同事負責的模組可能需要在不同的地方進行呼叫,而每一次去例項化或者去引入總覺得好不習慣,所以就看看有沒有其他好的捷徑可以優化這部分的邏輯。於是就找到了服務提供的這個部分。
由於小夥伴沒能很好理解和消化這部分所以,作為組長只能身先士卒,擼起袖子加油幹。終於在學院君,強大的文件說明下硬是把這塊豬骨頭給啃下了。在開始正文之前有幾個事情需要各位吃瓜的群眾好好理解一下先要不然根本沒法往下看,因為那些東西都是涉及了laravel的底層知識部分,雖然不需要面面俱到,但起碼還是要大概瞭解是什麼的。
什麼是容器?
服務容器是用來管理類依賴與執行依賴注入的工具。Laravel框架中就是使用服務容器來實現 “ 控制反轉 ” 和 “依賴注入 ”。
什麼是控制反轉(IoC)和依賴注入(DI)
控制反轉(IoC) 就是說把建立物件的“ 控制權” 進行轉移,以前建立物件的主動權和建立時機是由自己把控的,而現在這種權力轉移到第三方,也就是 Laravel 中的容器。
依賴注入(DI)則是幫助容器實現在執行中動態的為物件提供提依賴的資源
什麼是門面?
簡單說來就是模擬一個類,提供一個靜態魔術方法__callStatic
,並將該靜態方法對映到真正的方法上。
相關文章連結
Laravel 服務容器例項教程 —— 深入理解控制反轉(IoC)和依賴注入(DI)
下面我們就直接用程式碼說話吧!
(1)我們首先建立一個需要繫結到服務容器的Test類:
<?php
namespace App\Services;
class TestService
{
public function callMe($controller)
{
return 'Call Me From TestServiceProvider In '.$controller;
}
}複製程式碼
這個Test類其實就是你需要注入的服務的邏輯程式碼,其實這裡小俠是簡化了一部分,因為正常的情況下,我們還是需要用到契約的,(契約其實說白了就是類的介面)但是為了方面說明與學習我們當前的例子就沒有把契約引入。有興趣的道友可以自己去補充這方面的知識。
(2)通過laravel 自帶的服務注入命令,為當前的服務生成一個新的服務注入
php artisan make:provider TestServiceProvider複製程式碼
該命令會在app/Providers目錄下生成一個TestServiceProvider.php檔案,我們編輯該檔案內容如下:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Services\TestService;//需要注入的服務的路徑
class TestServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//使用singleton繫結單例,其中test名字適用於繫結的別名
$this->app->singleton('test',function(){
return new TestService();
});
}
}複製程式碼
繫結容器的方法比較,想了解更多可以參考-[ Laravel 5.5 文件 ] 底層原理 —— 服務容器
(3)註冊服務提供者
定義完服務提供者類後,接下來我們需要將該服務提供者註冊到應用中,很簡單,只需將該類追加到配置檔案config/app.php
的providers
陣列中即可:
'providers' => [
//其他服務提供者
App\Providers\TestServiceProvider::class,
],
複製程式碼
(4)為對應的方法建立對應的門面
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class TestClass extends Facade
{
protected static function getFacadeAccessor()
{
return 'test'; //其中裡面的test需要返回的是你在服務裡繫結的名稱
}
}複製程式碼
再然後需要到配置檔案config/app.php
中註冊門面類別名:
'aliases' => [
...//其他門面類別名對映
'TestClass' => App\Facades\TestClass::class,
],複製程式碼
最後在需要呼叫服務的地方使用對應的門面進行呼叫即可
<?php
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App;
use TestClass;
class IndexController extends Controller
{
public function index(){
$result=TestClass::callMe('TestController');
dump($result);
}}複製程式碼
至此,關於laravel的服務注入的例項教程已經全部介紹完畢,感謝各位道友的支援。如果你覺得這文章對你有幫助,希望你也可以點選下關注吧~