【Laravel】AppServiceProviderとは?

Laravel,PHP

ミニマリスト_カミ

kamiです。
TwitterYoutubeもやってます。

今回はLaravelのAppServiceProviderについての紹介です。
AppServiceProvider日て詳しく知らない方や、初めての方は覚えていきましょう。

AppServiceProviderとは?

AppServiceProviderはアプリケーションのサービスコンテナにサービスを登録したり、設定したりするためのクラスです。
サービスプロバイダは、Laravelの依存性注入コンテナを使用して、アプリケーションのサービスやクラスをバインドし、設定する場所です。

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * サービスの登録
     *
     * @return void
     */
    public function register()
    {
        // サービスの登録
    }

    /**
     * アプリケーションの起動後の処理
     *
     * @return void
     */
    public function boot()
    {
        // サービスの起動処理
    }
}

実行されるタイミング

Laravelアプリケーションが起動する際、config/app.phpファイルに登録された全てのサービスプロバイダが読み込まれます。

config/app.php

AppServiceProvider内の実行されるタイミングについて見ていきましょう


AppServiceProviderはconfigでアプリの起動時に実行されますが、プロパティやメソッドは手動と自動があります。

自動で呼び出されるメソッドとプロパティ

registerとbootはよく使うので覚えておきましょう

register

サービスプロバイダのregisterメソッドを使用して、サービスコンテナにサービスを登録します。

    /**
     * サービスの登録
     *
     * @return void
     */
    public function register()
    {
        // サービスの登録
        $this->app->singleton(ExampleService::class, function ($app) {
            return new ExampleService();
        });

        $this->app->bind(\App\Services\Foo::class, function ($app) {
            return new \App\Services\Foo\FooService();
        });
    }

singleton

singletonメソッドは、サービスコンテナにシングルトンバインディングを登録するために使用されます。最初に解決された後にサービスのインスタンスが再利用されることを意味します。
つまり、同じサービスが再度要求された場合、同じインスタンスが返されます。

bind

bindメソッドは、サービスコンテナに通常のバインディングを登録するために使用されます。
サービスが要求されるたびに新しいインスタンスが作成されることを意味します。

<?php

namespace App\Services;

interface Foo
{
   // 省略

}

?>

<?php

namespace App\Services\FooService;

class Foo implements FooService
{
 //省略

}

?>

boot

サービスプロバイダのbootメソッドを使用して、アプリケーションがすべてのサービスプロバイダをロードした後に実行されるコードを記述します。

    /**
     * アプリケーションの起動後の処理
     *
     * @return void
     */
    public function boot()
    {
        // サービスの起動処理
        View::share('key', 'value');
    }

$app

現在のアプリケーションインスタンスを保持します。

    /**
     * アプリケーションインスタンス
     *
     * @var \Illuminate\Contracts\Foundation\Application
     */
    protected $app;

    public function register()
    {
        // $this->app を使用してサービスを登録
    }

$defer(Laravel 5.8以降では非推奨)

サービスプロバイダが遅延ロードされるかどうかを示すフラグ。このフラグを設定することで、サービスプロバイダが遅延ロードされるかどうかを制御できます。

    /**
     * 遅延ロードを示すフラグ
     *
     * @var bool
     */
    protected $defer = true;

    public function provides()
    {
        return [ExampleService::class];
    }

$singletons

シングルトンとして登録するサービスのマッピングを定義します。

    /**
     * シングルトンサービスのマッピング
     *
     * @var array
     */
    public $singletons = [
        ExampleService::class => ExampleServiceImplementation::class,
    ];

    public function register()
    {
        // $singletons の登録は自動で行われる
    }

手動で呼び出されるメソッドとプロパティ

booting($callback)

サービスがブートされる前に実行されるコールバックを登録します。

    /**
     * サービスの起動前に実行するコールバックを登録
     *
     * @return void
     */
    public function register()
    {
        $this->booting(function () {
            // 起動前の処理
        });
    }

booted($callback)

サービスがブートされた後に実行されるコールバックを登録します。

    /**
     * サービスの起動後に実行するコールバックを登録
     *
     * @return void
     */
    public function register()
    {
        $this->booted(function () {
            // 起動後の処理
        });
    }

provides()

このサービスプロバイダが提供するサービス(バインディング)のリストを返します。
通常、遅延ロードされるサービスプロバイダで使用されます。

    /**
     * このプロバイダが提供するサービスを取得
     *
     * @return array
     */
    public function provides()
    {
        return [ExampleService::class];
    }

callAfterResolving($abstract, $callback = null)

指定したタイプが解決された後に呼び出されるコールバックを登録します。

    /**
     * 指定されたタイプが解決された後に実行するコールバックを登録
     *
     * @return void
     */
    public function register()
    {
        $this->callAfterResolving(ExampleService::class, function ($service, $app) {
            // 解決後の処理
        });
    }

callResolving($abstract, $callback = null)

指定したタイプが解決される直前に呼び出されるコールバックを登録します。

    /**
     * 指定されたタイプが解決される前に実行するコールバックを登録
     *
     * @return void
     */
    public function register()
    {
        $this->callResolving(ExampleService::class, function ($service, $app) {
            // 解決前の処理
        });
    }

Laravel,PHPLaravel

Posted by kami