web-dev-qa-db-ja.com

Laravel 4-サービスプロバイダーをいつ使用しますか?

Googleで検索しようとしましたが、詳細な情報が見つかりませんでした。

サービスプロバイダーは、関連するIoC登録を1つの場所にグループ化する優れた方法です。それらをアプリケーションのbootstrapコンポーネントへの方法と考えてください。

ドキュメントから理解していない。これは、パッケージを作成するときにのみ必要ですか?だから私が通常の開発者であり、パブリックにリリースするパッケージを作成していないとき-気にする必要はありませんか?

36
Darius.V

よく設計されたLaravelアプリケーションを構築するための鍵の1つは、サービスプロバイダーを組織ツールとして使用することを学習することです。 app/startファイル:これらのファイルでコンテナー登録を行う代わりに、関連サービスを登録するサービスプロバイダーを作成します。

したがって、これは、アプリケーションのサービスを1か所に整理して、より整理された状態に保つ方法です。サービスプロバイダーには、少なくとも1つのメソッドregisterが必要です。 registerメソッドは、プロバイダーがクラスをコンテナにバインドする場所です。要求がアプリケーションに入り、フレームワークが起動すると、構成ファイルにリストされているプロバイダーでregisterメソッドが呼び出されます

_'providers' => array(
    'Illuminate\Foundation\Providers\ArtisanServiceProvider',
    'Illuminate\Auth\AuthServiceProvider',
    'Illuminate\Cache\CacheServiceProvider',
    // more ...
    'Illuminate\Html\HtmlServiceProvider',
    // more ...
)
_

これは_app.php_構成ファイルのプロバイダー配列であり、これは_'Illuminate\Html\HtmlServiceProvider.php'_に格納されているHtmlServiceProviderです。

_use Illuminate\Support\ServiceProvider;
    class HtmlServiceProvider extends ServiceProvider {

    //...
    public function register()
    {
        $this->registerHtmlBuilder();

        $this->registerFormBuilder();
    }

    protected function registerHtmlBuilder()
    {
        $this->app['html'] = $this->app->share(function($app)
        {
            return new HtmlBuilder($app['url']);
        });
    }

    protected function registerFormBuilder()
    {
        $this->app['form'] = $this->app->share(function($app)
        {
            $form = new FormBuilder($app['html'], $app['url'], $app['session']->getToken());
            return $form->setSessionStore($app['session']);
        });
    }

}
_

Laravelが起動すると、この(register)メソッドを呼び出します。このメソッドには2つの行があり、これらの行はregisterHtmlBuilder()registerFormBuilder()、これら両方のメソッドはIoCコンテナへのコンポーネントを使用して

_$this->app['html'] = $this->app->share(...);
$this->app['form'] = $this->app->share(...);
_

この場合、両方とも_html/form_クラスのインスタンスを返す匿名関数であるため、使用する場合は

_Html::link(...);
_

または、フォームを使用して

_Form::input(...);
_

アプリケーションで使用可能な_$app_オブジェクトからバインドクラスを取得します。この場合、_'Html' => 'Illuminate\Support\Facades\Html',_を使用して、_app.php_ファイルのaliases配列のメインクラスにエイリアスを作成します。

したがって、Laravelのサービスプロバイダーは、アプリケーションの起動プロセス中に、すてきな方法で物事を整理する方法です。Laravelは、すべてのregisterメソッドを実行します各コンポーネントがIoCコンテナーに使用可能(バインド)になるようにサービスプロバイダーを設定し、アプリケーションでアクセスできるようにします。

サービスプロバイダーからすべてのregisterメソッドを呼び出した後、それらのサービスプロバイダーからすべてのbootメソッドが呼び出されることに注意してください。その場合、サービスプロバイダークラス内のアプリケーション(IoC /サービスコンテナー)からサービスを使用する必要がある場合、サービスプロバイダーの登録中にサービスが利用可能であることは保証されないため、ブートメソッドからそのサービスを使用する必要があります(registerメソッド内)サービスは各サービスプロバイダーのregisterメソッドを介して登録されますが、bootメソッド内ではすべてのサービスが登録されることが望ましいため、任意のサービスを使用できます。

この回答を確認してください Laravel 4:ファサードはどのように解決されますか? も、理解に役立つかもしれません。

67
The Alpha

サービスプロバイダーができることは何もありません。app/ start/global.phpに平手打ちすることはできませんが、サービスプロバイダーを使用すると、すべてのロジックを1か所に集めて、よりモジュール方式でアプリケーションを開発できます。

パッケージを作成する場合、サービスプロバイダーはほとんど必須です。

7
Andreas

Laravelでは、サービスプロバイダーはIoCコンテナーの動作方法に直接関係しています。依存関係へのより簡単でモジュール化されたアプローチが可能になります。実際、コードをbootstrapのように(Laravelの外側であっても)に整理するのに最適なパターンです。通常の開発者であれば、 Laravel=サービスプロバイダーの基本を知る必要があります。そのパターンはLaravelアーキテクチャの不可欠な部分です。作業を簡単にすることができると確信しています。

たとえば、パッケージをインストールする場合、アプリケーションはそのパッケージへのアクセスを許可する必要があります。最良の解決策の1つは、サービスプロバイダーリストとファサードを使用することです。一方、SP-sの基本を知らずにLaravel開発者になることは想像できません。

1
carousel