ホームページ >バックエンド開発 >PHPチュートリアル >Laravelサービスプロバイダーで遅延読み込みを開発および設定するときに発生する問題

Laravelサービスプロバイダーで遅延読み込みを開発および設定するときに発生する問題

小云云
小云云オリジナル
2018-01-08 10:11:141714ブラウズ

この記事では、Laravel サービス プロバイダーで遅延読み込みを開発および設定するときに発生する問題について、サンプル コードを通じて詳細に紹介します。これは、学習や仕事に必要なすべての人の参考と学習に役立ちます。以下をフォローしてください。一緒に見てみましょう。皆さんのお役に立てれば幸いです。

前書き

この記事は主に、Laravel Service Provider で遅延読み込みを設定するときに発生するいくつかの問題を紹介します。最近、laravel-database-logger パッケージを開発しているときに、ServiceProvider を設定するときに発生する問題を発見しました。 defer属性をtrueに設定した場合、registerメソッドに登録したミドルウェアは無効となります。

class ServiceProvider extends \Illuminate\Support\ServiceProvider
{
 protected $defer = true; 
 public function register()
 {
 $this->mergeConfigFrom(
  __DIR__ . '/../config/config.php', 'ibrand.dblogger'
 );
 $this->app->singleton(DbLogger::class, function ($app) {
  return new DbLogger();
 });
 //当 $defer 设置为 true 时,在路由中引用 databaselogger middleware 会报错,提示 databaselogger class not found.
 $this->app[\Illuminate\Routing\Router::class]->middleware('databaselogger', Middleware::class);

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

問題が発生したとき、defer 属性を true に設定したことが原因であると考え、すぐにソース コードを変更し、保護された $defer = true; のプロンプトが表示されました。見つかった。Laravel この ServiceProvder が登録されていないことを示しています

次にこの問題を解決する方法を試しました:

1. 自身のコードに問題があるかどうかを確認します。通常登録されている AppServiceProvider に独自の ServiceProvider を登録します

public function register()
 {
 //
 $this->app->register(\Ibrand\DatabaseLogger\ServiceProvider::class);
 }

登録後の結果はすべて正常です。

2. ソースコードを調べます


config/app.php ではプロバイダーの登録は無効ですが、他の ServiceProvider の登録は有効であり、別の問題を示しています。

IlluminateFoundationApplication のソース コードを調べて registerConfiguredProviders メソッドを見つけます。

Laravel は、このメソッドの config/app.php にあるプロバイダーのコンテンツを読み取り、ProviderRepository にロードします。

(new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))
     ->load($providers->collapse()->toArray());

$this->getCachedServicesPath() に焦点を当てています。ソースコードを通じて、Laravel が bootstrap/cache/services.php ファイルに基づいて ServiceProvider を登録する方法を決定していることがわかりました。

このとき、以前コメントした //protected $defer = true; のコードが無効のままだった理由を考えました。

そのため、コメントされた //protected $defer = true; コードを有効にするには、それを実行する必要があります

php artisan clear-compiled 
php artisan optimize

その後、問題は解決され、ServiceProvider の原理がよりよく理解されました。

したがって、ServiceProvider の遅延読み込みを使用する予定がある場合は、ミドルウェア、ルート、およびその他の一連の操作を登録することは固く禁じられていることに注意してください。同時に、defer 属性値を変更した後、phpArtisanClear-compiled および phpArtisanOptimize を実行して、ServiceProvider キャッシュを更新する必要があります。


3. AppServiceProvider への登録が有効なのはなぜですか?

それは非常に簡単です。AppServiceProvider は読み込みを遅延させないため、AppServiceProvider で register メソッドを実行して新しい ServiceProvider を登録しても読み込みは遅延しません。

概要


ServiceProviderの遅延読み込みは注意して使用してください


defer属性値を変更した後、phpArtisanClear-compiledとphpArtisanOptimizeを実行してServiceProviderキャッシュを更新する必要があります。


遅延ロードされた ServiceProvider にミドルウェアを登録し、ルーティングすることは固く禁止されています。

関連する推奨事項:

Laravel サービスプロバイダーの問題

Laravel サービスプロバイダーは、依存関係の注入中にインスタンス化されるクラスを決定する方法

Laravel サービスプロバイダー 開発中に遅延読み込みを設定するときに発生した問題の解決策

以上がLaravelサービスプロバイダーで遅延読み込みを開発および設定するときに発生する問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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