しかし、「スタートアップ」とは何を意味するのでしょうか?通常、これは、サービス コンテナー バインディング、イベント リスナー、ミドルウェア、さらにはルートの登録を含む、登録を意味します。サービス プロバイダーはアプリケーション構成の中心です。
Laravel に付属の config/app.php ファイルを開くと、アプリケーションによってロードされるすべてのサービスプロバイダーのクラスが表示されます。これは、もちろん、それらの多くは遅延ロードされることを意味します。毎回ロードされるわけではなく、リクエストごとにロードされ、実際に使用されるときにのみロードされます。
この章では、独自のサービスプロバイダーを作成し、Laravel アプリケーションに登録する方法を学びます。
Artisan コマンド make:provider: を使用して、新しいプロバイダーを簡単に生成できます。
php artisan make:provider RiakServiceProviderregister メソッド
前に述べたように、 register メソッドでは、サービス コンテナにバインドするだけで、他のことは行わないでください。 、まだ読み込まれていないサービスプロバイダーが提供するサービスを誤って使用してしまう可能性があります。
ここで、基本的なサービス プロバイダーがどのようなものかを見てみましょう:
<?phpnamespace App\Providers;use Riak\Connection;use Illuminate\Support\ServiceProvider;class RiakServiceProvider extends ServiceProvider{ /** * 在容器中注册绑定. * * @return void */ public function register() { $this->app->singleton('Riak\Contracts\Connection', function ($app) { return new Connection(config('riak')); }); }}このサービス プロバイダーは register メソッドのみを定義し、このメソッドを使用してサービス コンテナー内の RiakContractsConnection の実装を定義します。
ブートメソッド
サービスプロバイダーにビューコンポーザーを登録したい場合はどうすればよいでしょうか?これにはブートメソッドが必要です。このメソッドは、すべてのサービス プロバイダーが登録されるまで呼び出されません。これは、フレームワークによって登録された他のすべてのサービスにアクセスできることを意味します。
<?phpnamespace App\Providers;use Illuminate\Support\ServiceProvider;class EventServiceProvider extends ServiceProvider{ /** * Perform post-registration booting of services. * * @return void */ public function boot() { view()->composer('view', function () { // }); } /** * 在容器中注册绑定. * * @return void */ public function register() { // }}ブート メソッドの依存関係注入
ブート メソッド、サービスにヒントの依存関係を入力できます。コンテナーは、必要な依存関係を自動的に登録します。
use Illuminate\Contracts\Routing\ResponseFactory;public function boot(ResponseFactory $factory){ $factory->macro('caps', function ($value) { // });}
独自のサービス プロバイダーを登録するには、それを配列に追加するだけです:
'providers' => [ // 其它服务提供者 App\Providers\AppServiceProvider::class,],
プロバイダーを遅延ロードするには、defer 属性を true に設定し、プロバイダーによって登録されたサービスコンテナーバインディングを返す Provides メソッドを定義します:
<?phpnamespace App\Providers;use Riak\Connection;use Illuminate\Support\ServiceProvider;class RiakServiceProvider extends ServiceProvider{ /** * 服务提供者加是否延迟加载. * * @var bool */ protected $defer = true; /** * 注册服务提供者 * * @return void */ public function register() { $this->app->singleton('Riak\Contracts\Connection', function ($app) { return new Connection($app['config']['riak']); }); } /** * 获取由提供者提供的服务. * * @return array */ public function provides() { return ['Riak\Contracts\Connection']; }}Laravel は、遅延サービスプロバイダーによって提供されるすべてのサービスと、そのクラス名をコンパイルして保存します。サービスプロバイダー。その後、これらのサービスのいずれかを解決しようとした場合にのみ、Laravel はそのサービスプロバイダーを読み込みます。