ホームページ  >  記事  >  バックエンド開発  >  [ Laravel 5.2 ドキュメント ] アーキテクチャ -- サービスプロバイダー

[ Laravel 5.2 ドキュメント ] アーキテクチャ -- サービスプロバイダー

WBOY
WBOYオリジナル
2016-06-23 13:20:02727ブラウズ

1. はじめに

サービスプロバイダーは、すべての Laravel アプリケーションを起動するための中心です。独自のアプリケーションとすべての Laravel のコアサービスは、サービスプロバイダーを通じて起動されます。

しかし、「スタートアップ」とは何を意味するのでしょうか?通常、これは、サービス コンテナー バインディング、イベント リスナー、ミドルウェア、さらにはルートの登録を含む、登録を意味します。サービス プロバイダーはアプリケーション構成の中心です。

Laravel に付属の config/app.php ファイルを開くと、アプリケーションによってロードされるすべてのサービスプロバイダーのクラスが表示されます。これは、もちろん、それらの多くは遅延ロードされることを意味します。毎回ロードされるわけではなく、リクエストごとにロードされ、実際に使用されるときにのみロードされます。

この章では、独自のサービスプロバイダーを作成し、Laravel アプリケーションに登録する方法を学びます。

2. サービス プロバイダーを作成する

すべてのサービス プロバイダーは IlluminateSupportServiceProvider クラスを継承します。この抽象クラスを継承するには、サービス プロバイダーで少なくとも 1 つのメソッド register を定義する必要があります。 register メソッド内で行う必要があるのは、サービス コンテナにバインドすることだけです。タイム リスナー、ルート、その他の機能を登録しようとしないでください。

Artisan コマンド make:provider: を使用して、新しいプロバイダーを簡単に生成できます。

php artisan make:provider RiakServiceProvider

register メソッド

前に述べたように、 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) {        //    });}

3. サービス プロバイダーの登録

すべてのサービス プロバイダーは、すべてのサービス プロバイダー名の Providers 配列のリストを含む構成ファイルを通じて登録されます。デフォルトでは、すべてのコアサービスプロバイダーがリストされます。これらのサービスプロバイダーは、メール、キュー、キャッシュなどの Laravel コアコンポーネントを開始します。

独自のサービス プロバイダーを登録するには、それを配列に追加するだけです:

'providers' => [     // 其它服务提供者     App\Providers\AppServiceProvider::class,],

4. 遅延読み込みサービス プロバイダー

プロバイダーがサービス コンテナーにバインディングを登録するだけの場合は、バインディングの読み込みを延期することを選択できます。実際には、登録されたバインディングが必要です。このようなプロバイダーの遅延ロードは、リクエストごとにファイル システムからロードされるわけではないため、アプリケーションのパフォーマンスを向上させます。

プロバイダーを遅延ロードするには、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 はそのサービスプロバイダーを読み込みます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。