簡介
服務提供者是 laravel 應用啟動的中心。你自己的應用以及 laravel 的核心服務都是通過服務提供者來啟動的。
但是,我們所指的啟動是什麼意思?通常情況下,這意味著註冊,包含註冊服務的綁定,事件監聽,中介軟體,和路由。服務提供者是應用配置的中心。
如果你開啟 config/app.php 檔案,你會發現 providers 數組。這些都是你的應用將要載入的服務提供者類。當然,很多是消極式載入的提供者,意思就是並不是所有的請求都會載入這些提供者,而是只有需要的時候才會載入。
在此篇,你將學會如果去編寫自己的服務提供者並且將其註冊到應用中。
編寫服務提供者
所有的服務提供者都繼承自 Illuminate\Support\ServiceProvider 類。這個抽象類別要求你的提供者必須最少定義一個 register 方法。在 register 方法中你應該只綁定內容到服務容器。你永遠不要嘗試在其中註冊任何的事件監聽,路由或者其它功能。
Artisan CLI 可以通過 make:provider 命令來非常便捷的產生一個新的提供者:
php artisan make:provider RiakServiceProvider
註冊方法
就如前面所提到的,在 register 方法中,你應該只做一件事,那就是綁定事物到服務容器中。不要做其它的事情。否則,可能你所使用的提供者提供的服務還沒有被註冊。現在,讓我們來看一個最基礎的服務提供者:
app->singleton(Connection::class, function ($app) { return new Connection(config('riak')); }); }}
這個服務提供者僅僅只定義了一個 register 方法,並且使用這個方法在服務容器中定義了一個 Riak\Connection 的實現。如果你並不理解服務容器是如何工作的,你可以看一下服務容器的文檔。
啟動方法
如果我們想在服務提供者中註冊一個視圖 composer,那麼我們應該在 boot 方法中做這些。boot 方法會在所有的服務提供者都註冊完成之後才會被執行。這意味著你有訪問所有服務的許可權:
composer('view', function () { // }); }}
啟動方法的依賴注入
你可以在服務提供者的 boot 方法中使用類型提示來標識依賴。服務容器將會自動的將所需要的依賴注入進去:
use Illuminate\Contracts\Routing\ResponseFactory;public function boot(ResponseFactory $factory){ $factory->macro('caps', function ($value)){ // };}
註冊提供者
所有的服務提供者都被註冊在 config/app.php 設定檔中。這個檔案包含了 providers 數組,這數組列出了所有服務提供者的名字。預設的,laravel 中的核心服務都被註冊在這個數組裡。這些提供者啟動了 laravel 中的核心組件,如郵件,隊列,緩衝和其他。
你可以在該數組中進行添加註冊提供者:
'providers' => [ // Other Service Providers App\Providers\AppServiceProvider::class,],
消極式載入提供者
如果你的提供者只是在服務容器中註冊一些綁定資訊,那麼你可以選擇延遲註冊,這樣這些服務只有在真正被需要用到時才會進行註冊。延遲註冊能夠提高你的應用的效能。因為它不會在所有請求到來時都通過檔案系統來載入。
為了延遲提供者的載入,你可以在提供者類中設定 defer 屬性為 true 並且定義一個 provides 方法。provides 方法會返回提供者註冊的服務容器的綁定:
app-singleton(Connection::class, function ($app) { return new Connection($app['config']['riak']); }); } /** * Get the services provided by the provider. * * @return array */ public function provides() { return [Connection::class]; }}
laravel 會編譯和儲存所有消極式載入的服務提供者的服務列表及服務提供者的類名。然後,只有當你嘗試解析其中的某個服務時,laravel 才會載入其服務提供者。