言い換えれば、サービスプロバイダーは、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()
.boot()
すべてのプロバイダーの。 繰り返しますが、配列の上から下に XNUMX つずつ 'providers'
.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.php
e routes/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() メソッドを使用すると、次のことが可能になります。 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() メソッドを使用すると、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
あなたも興味があるかもしれません:
先週の月曜日、フィナンシャル・タイムズ紙はOpenAIとの契約を発表した。 FT は世界クラスのジャーナリズムにライセンスを供与しています…
何百万人もの人々がストリーミング サービスに月額料金を払っています。あなたは…というのが一般的な意見です。