サービスプロバイダー
- 登録方法
- バインディングとシングルトンの機能
- ##ブートストラップ メソッド
- 遅延プロバイダー
サービスプロバイダー
はじめに
サービスプロバイダーは、すべての Laravel アプリケーションのハブです。アプリケーションと、サーバーを介してブートストラップされるコア Laravel サービスは、サービス プロバイダーを介してブートストラップされます。
ところで、「指導」とは何を意味するのでしょうか?通常、サービス コンテナ バインディング、イベント リスナー、ミドルウェア、さらにはルーティングの登録など、私たちのものは Registration として理解できます。サービス プロバイダーは、アプリケーションの構成の中心となります。
Laravel の
config/app.php
ファイルを開くと、providers
配列が表示されます。配列の内容は、アプリケーションによってロードされるすべてのサービス プロバイダーのクラスです。もちろん、すべてのリクエストでロードされるわけではなく、サービスが実際に必要な場合にのみロードされる「遅延」プロバイダーも数多くあります。この記事では、独自のサービス プロバイダーを作成し、それを Laravel アプリケーションに登録する方法を学習します。
サービス プロバイダーの作成
すべてのサービス プロバイダーは、
Illuminate\Support\ServiceProvider
クラスを継承します。ほとんどのサービス プロバイダーには、register
メソッドとboot
メソッドが含まれています。register
メソッドでは、サービス コンテナにバインドするだけです。register
メソッドでリスナー、ルート、またはその他の関数を登録しようとしないでください。Artisan コマンド ライン ツールを使用して、
make:provider## を通じてリスナー、ルート、またはその他の関数を生成してください。 # コマンド。新しいプロバイダー:
php artisan make:provider RiakServiceProvider
上記のように、
registerメソッドでは、次のことを行うだけです。 need サービスをサービス コンテナにバインドします。
$appregister
メソッドにリスナー、ルート、またはその他の機能を登録しようとしないでください。そうしないと、まだロードされていないサービス プロバイダーのサービスを誤って使用してしまう可能性があります。基本的なサービス プロバイダーを見てみましょう。どのサービス プロバイダー メソッドでも、常に
プロパティを通じてサービス コンテナーにアクセスします。
register
このサービス コンテナーは単に<?php namespace App\Providers;use Riak\Connection; use Illuminate\Support\ServiceProvider; class RiakServiceProvider extends ServiceProvider{ /** * 在服务容器里注册 * * @return void */ public function register() { $this->app->singleton(Connection::class, function ($app) { return new Connection(config('riak')); }); } }
メソッドを定義し、このメソッドを使用します。サービスコンテナに
ブートストラップ メソッド View Composer をサービス プロバイダーに登録するにはどうすればよいですか?これには、Riak\Connection
インターフェースを定義します。サービス コンテナがどのように機能するか理解できない場合は、そのドキュメントを確認してください。bindings
とsingletons
サービス プロバイダーが多数の単純なバインディングを登録している場合は、
bindings
と ## を使用するとよいでしょう。各コンテナー バインディングを手動で登録する代わりに、#singletonsプロパティを使用します。サービス プロバイダーがフレームワークによって読み込まれると、これらのプロパティが自動的にチェックされ、対応するバインディングが登録されます。
<?php namespace App\Providers; use App\Contracts\ServerProvider; use App\Contracts\DowntimeNotifier; use Illuminate\Support\ServiceProvider; use App\Services\PingdomDowntimeNotifier; use App\Services\DigitalOceanServerProvider; class AppServiceProvider extends ServiceProvider{ /** * 设定所有的容器绑定的对应关系 * * @var array */ public $bindings = [ ServerProvider::class => DigitalOceanServerProvider::class, ]; /** * 设定所有的单例模式容器绑定的对应关系 * * @var array */ public $singletons = [ DowntimeNotifier::class => PingdomDowntimeNotifier::class, ]; }
boot
メソッドを使用する必要があります。
このメソッドは、すべてのサービス プロバイダーが登録されるまで呼び出されません。これは、フレームワークによって登録された他のすべてのサービスにアクセスできることを意味します:<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class ComposerServiceProvider extends ServiceProvider{ /** * 启动所有的应用服务。 * * @return void */ public function boot() { view()->composer('view', function () { // }); } }
スタートアップ メソッドの依存関係注入サービス プロバイダーのboot
メソッドのタイプ ヒントを設定できます。サービス コンテナーは、必要な依存関係を自動的に挿入します。
use Illuminate\Contracts\Routing\ResponseFactory; public function boot(ResponseFactory $response){ $response->macro('caps', function ($value) { // }); }
サービス プロバイダーの登録すべてのサービス プロバイダーは構成ファイルを介して行われますconfig /app.php
プロバイダーを登録するには、それを配列に追加するだけです:登録します。このファイルには、すべてのサービス プロバイダーの名前をリストする
providers配列が含まれています。デフォルトでは、すべてのコア サービス プロバイダーがリストされます。これらのサービス プロバイダーは、メール、キュー、キャッシュなどの Laravel コア コンポーネントを開始します。
'providers' => [ // 其他服务提供者 App\Providers\ComposerServiceProvider::class,],
Deferred Provider サービス プロバイダーの場合は、サービス コンテナに のみ登録されています。登録されたサービスが実際に必要になるまで、バインディングの読み込みを遅らせることを選択できます。このようなプロバイダーの遅延読み込みにより、アプリケーションのパフォーマンスが向上します。リクエストごとにファイル システムから送信されます。
Laravel は、遅延サービスプロバイダーによって提供されるすべてのサービスのリストを、そのサービスプロバイダークラスの名前とともにコンパイルして保存します。したがって、Laravel は、サービスの 1 つを解決しようとしている場合にのみサービスプロバイダーをロードします。 プロバイダーの読み込みを遅らせるには、\Illuminate\Contracts\Support\DeferrableProvider
インターフェイスを実装し、
providesメソッドを構成する必要があります。この
providesメソッドは、このプロバイダーによって登録されたサービス コンテナー バインディングを返します:
<?php namespace App\Providers; use Riak\Connection; use Illuminate\Support\ServiceProvider; use Illuminate\Contracts\Support\DeferrableProvider; class RiakServiceProvider extends ServiceProvider implements DeferrableProvider{ /** * 注册服务提供者。 * * @return void */ public function register() { $this->app->singleton(Connection::class, function ($app) { return new Connection($app['config']['riak']); }); } /** * 获取由提供者提供的服务。 * * @return array */ public function provides() { return [Connection::class]; } }
この記事は、LearnKu.com Web サイトで最初に公開されました。
- ##スタートアップ メソッドの依存性注入