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

Laravelサービスプロバイダーの開発中に遅延読み込みを設定するときに発生する問題の詳細な説明

jacklove
jackloveオリジナル
2018-07-03 17:50:032675ブラウズ

この記事では、Laravel Service Provider で遅延読み込みを開発および設定する際に発生する問題を主に紹介します。サンプルコードを通じて詳細に紹介されています。あらゆる人の学習や仕事に一定の参考学習価値があります。以下のエディタで見てみましょう。

まえがき

この記事では主に、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 に設定したことが原因ではないかと考え、すぐにソース コードを protected $ に修正しました。 defer = true; コードはコメントアウトされていますが、結果は依然としてプロンプト databaselogger class not found. であり、Laravel がこの ServiceProvder を登録していないことを示しています

次のステップは次のとおりです。この問題を解決する方法を見つけて、次の方法を試してみました:

1. 自分のコードに問題があるかどうかを確認します

通常登録されている AppServiceProvider に独自の ServiceProvider を登録します

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

登録後はすべて正常です。

2. ソース コードを確認します

config/app.php のプロバイダーの登録は無効ですが、他のファイルの登録は無効ですServiceProvider は有効です。説明はその他の問題です。

Illuminate\Foundation\Application ソース コードを調べて、 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 属性値を変更した後、

php army-clear-compiled および php army optimize を実行して、ServiceProvider キャッシュを更新する必要があります。

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

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

#概要
#遅延読み込み ServiceProvider の使用には注意が必要です


defer 属性値を変更した後の場合は、

phpあーちつクリアコンパイルされた

php 職人最適化 を実行して、ServiceProvider キャッシュを更新する必要があります。
遅延ロードされた ServiceProvider にミドルウェアを登録し、ルーティングすることは固く禁止されています。

#興味があるかもしれない記事:

PHP はソート ヒープ ソート アルゴリズムを実装します


PHPシンプルな選択ソートアルゴリズム学習


WeChatジャンプPHPコード実装の詳細説明


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

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