グッズ

Laravel のサービス プロバイダー: サービス プロバイダーとは何か、Laravel でサービス プロバイダーを使用する方法

Laravel サービスプロバイダーは、アプリケーションが起動される中心的な場所です。 つまり、laravel コア サービスとアプリケーション サービス、クラスとその依存関係は、プロバイダーを介してサービス コンテナーにプッシュされます。 

言い換えれば、サービスプロバイダーは、Laravel と呼ばれるエンジンの「サービスコンテナ」と呼ばれるタンクに「クラス」の燃料を注ぐ漏斗のようなものです。

config/app.php を開くと、「provider」という名前の配列が表示されます。

'providers' => [

        /*
        * Laravel Framework Service Providers...
        */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        .
        .
        .
],

これらは、laravelとともに提供されるサービスプロバイダーの一部です。つまり、サービスコンテナーに配置される基本的なサービスです。

私が service provider それらは実行されていますか?

ドキュメントを見ると リクエストに応じてライフサイクル 、次のファイルが最初に実行されます。

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php と彼の Middlewares
  • Service Providers:この記事の内容

service provider 彼らはロードされていますか? 

彼らはそれらです defi配列内のナイト config/app.php:

return [
 
    // ... other configuration values
 
    'providers' => [
 
        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
 
        // ... other framework providers from /vendor
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,
 
        /*
         * PUBLIC Service Providers - the ones we mentioned above
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
 
    ],
 
];

ご覧のとおり、のリストがあります service provider フォルダ内で非公開 /vendor、それらに触れたり、変更したりしないでください。 私たちが興味を持っているものは以下にあります。 BroadcastServicerProvider おそらくめったに使用されないため、デフォルトで無効になっています。

これらのサービス プロバイダーはすべて上から下に実行され、リストを繰り返します 二度:

  • 最初の反復では、オプションのメソッドを探しています register()、メソッドの前に構成されたものを(最終的に)実行するのに役立ちます boot().
  • XNUMX 回目の繰り返しでメソッドを実行します boot() すべてのプロバイダーの。 繰り返しますが、配列の上から下に XNUMX つずつ 'providers'.
  • 最後に、すべてのサービスプロバイダーが処理された後、Laravel はパス (ルート) の解析、コントローラーの実行、テンプレートの使用などに進みます。

サービスプロバイダー Laravel predefiニニ

I Service Providers Laravelに含まれており、フォルダに存在するすべてのものです app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

これらはすべて PHP クラスであり、それぞれが独自のトピックに関連しています。 App, Auth, Broadcasting, Events e Routes. しかし、それらには共通点が XNUMX つあります。それはメソッドです。 boot().

そのメソッド内で、これらのセクションのいずれかに関連するコードを記述できます。 auth, events, routeなどつまり、サービス プロバイダーは、グローバルな機能を登録するための単なるクラスです。

これらはアプリケーション ライフサイクルの非常に早い段階で実行されるため、"プロバイダー" として分離されています。したがって、実行中のスクリプトがモデルまたはコントローラーに到達する前に、ここでグローバルなものが便利です。

ほとんどの機能は RouteServiceProvider にあります。コードは次のとおりです。

class RouteServiceProvider extends ServiceProvider
{
    public const HOME = '/dashboard';
 
    public function boot()
    {
        $this->configureRateLimiting();
 
        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->group(base_path('routes/api.php'));
 
            Route::middleware('web')
                ->group(base_path('routes/web.php'));
        });
    }
 
    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
        });
    }
}

これは、ファイルが構成されているクラスです route、と routes/web.phproutes/api.php デフォルトで含まれていますdefiニタ。 API については、次のような異なる構成もあることに注意してください。 エンドポイント プレフィックス /api とミドルウェア api すべて routes.

編集できます service providers、フォルダにない /vendor. これらのファイルのカスタマイズは、多くのパスがあり、それらを特定のファイルに分割したい場合に行います。 あなたが作成します routes/auth.php そこにパスを入れてから、メソッドでそのファイルを「有効」にします boot() di RouteServiceProvider、XNUMX番目の文を追加するだけです:

`Route::middleware('web') // or maybe you want another middleware?
    ->group(base_path('routes/auth.php'));

AppServiceProvider 空っぽです。 コードを追加する典型的な例 AppServiceProvider、Eloquent で遅延読み込みを無効にすることについてです。 これを行うには、必要なのは XNUMX行追加 メソッドで boot():

イノベーションニュースレター
イノベーションに関する最も重要なニュースをお見逃しなく。 メールで受け取るにはサインアップしてください。
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

関係モデルがロードされていない場合、これは例外をスローします。

独自に作成する service provider カスタム

プレファイルに加えてdefi新しいものを簡単に作成できます Service Provider、それ以前のトピック以外のトピックに関連するdefiとして終わった auth/event/routes.

かなり典型的な例はビュー構成です Blade. ディレクティブを作成できます Blade、そのコードをメソッドに追加します boot() のいずれか service provider、デフォルトを含む AppServiceProvider. 今すぐ作成しましょう ViewServiceProvider セパラト。

次のコマンドで生成できます。

php artisan make:provider ViewServiceProvider

これは事前にクラスを生成しますdefi夜:

namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
 
class ViewServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
 
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

内部を見るとわかるように、XNUMX つの方法があります。

register() メソッド

register() メソッドを使用すると、次のことが可能になります。 defi私たちのサービスコンテナへのリンクです。 たとえば、次のコードでは次のようになります。

public function register()
{
    $this->app->singleton(my_class, function($app){
        return new MyClass($app);
    });
}

$this->app は、シングルトン クラスがアプリを通じてアクセスできる laravel のグローバル変数です。

シングルトンは機能です。 この機能を適用すると、アプリでパラメーターとして渡されるクラスが何であれ、アプリケーション全体で XNUMX つのインスタンスのみを持つ必要があることをアプリケーションに通知します。 これは、MyClass が XNUMX 回解決され、my_class 変数を使用してアクセスできるインスタンスが XNUMX つしかないことを意味します。

boot() メソッド

boot() メソッドを使用すると、register メソッドを使用して以前に登録されたすべてのサービスにアクセスできます。 その後、このメソッドを使用してアプリケーションにサービス全体を含めることができます。

前の例に戻り、メソッドを削除しましょう register() そしてその中で boot() Blade ディレクティブ コードを追加します。

use Illuminate\Support\Facades\Blade;
 
public function boot()
{
    Blade::directive('datetime', function ($expression) {
        return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
    });
}

の別の例 ViewServiceProvider それは関係する View Composers、ここにスニペットがあります Laravelの公式サイトより :

use App\View\Composers\ProfileComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
 
class ViewServiceProvider extends ServiceProvider
{
    public function boot()
    {
        // Using class based composers...
        View::composer('profile', ProfileComposer::class);
 
        // Using closure based composers...
        View::composer('dashboard', function ($view) {
            //
        });
    }
}

実行するには、この新しいプロバイダーを in provider 配列に追加/登録する必要があります config/app.php:

return [
    // ... other configuration values
 
    'providers' => [
 
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
 
        // Add your provider here
        App\Providers\ViewServiceProvider::class,
    ],
];

Ercole Palmeri

あなたも興味があるかもしれません:

イノベーションニュースレター
イノベーションに関する最も重要なニュースをお見逃しなく。 メールで受け取るにはサインアップしてください。

最近の記事

子供のためのぬり絵の利点 - すべての年齢層のための魔法の世界

ぬり絵を通じて細かい運動能力を発達させることで、子供たちは書くなどのより複雑なスキルを習得できるようになります。色…

2月2024

未来はここにあります: 海運業界が世界経済をどのように変革しているか

海軍部門は真の世界経済大国であり、150 億市場に向けて舵を切り続けています...

1月2024

パブリッシャーと OpenAI が人工知能によって処理される情報の流れを規制する契約に署名

先週の月曜日、フィナンシャル・タイムズ紙はOpenAIとの契約を発表した。 FT は世界クラスのジャーナリズムにライセンスを供与しています…

4月30 2024

オンライン支払い: ストリーミング サービスで永久に支払いができる仕組みをご紹介します

何百万人もの人々がストリーミング サービスに月額料金を払っています。あなたは…というのが一般的な意見です。

4月29 2024

あなたの言語でイノベーションを読む

イノベーションニュースレター
イノベーションに関する最も重要なニュースをお見逃しなく。 メールで受け取るにはサインアップしてください。

Seguici