Heim >Backend-Entwicklung >PHP-Tutorial >Ausführliche Erläuterung der Probleme, die beim Einrichten von Lazy Loading während der Entwicklung des Laravel Service Providers aufgetreten sind

Ausführliche Erläuterung der Probleme, die beim Einrichten von Lazy Loading während der Entwicklung des Laravel Service Providers aufgetreten sind

jacklove
jackloveOriginal
2018-07-03 17:50:032674Durchsuche

Dieser Artikel führt Sie hauptsächlich in die Probleme ein, die beim Entwickeln und Einrichten von Lazy Loading in Laravel Service Provider auftreten. Der Artikel stellt es anhand von Beispielcodes ausführlich vor Werfen wir einen Blick darauf mit dem Editor unten.

Vorwort

Dieser Artikel stellt hauptsächlich einige Probleme vor, die beim Einrichten des verzögerten Ladens in Laravel Service Provider auftreten. Der gesamte Artikel ist auf aktuelle Probleme zurückzuführen Projektanforderungen: Als ich kürzlich das Laravel-Database-Logger-Paket entwickelte, stellte ich fest, dass das Setzen des ServiceProvider-Defer-Attributs auf true dazu führt, dass die in der Registermethode registrierte Middleware ungültig wird.

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];
 }
}

Als das Problem auftrat, vermutete ich, dass es durch das Setzen des Defer-Attributs auf „true“ verursacht wurde, also habe ich sofort den Quellcode geändert und den Code auskommentiert von protected $defer = true; ist das Ergebnis immer noch eine Eingabeaufforderung databaselogger class not found., die darauf hinweist, dass Laravel diesen ServiceProvider nicht registriert hat

Der nächste Schritt besteht darin, herauszufinden, wie dieses Problem gelöst werden kann:

1 . Überprüfen Sie, ob es Probleme mit Ihrem eigenen Code gibt

Registrieren Sie Ihren eigenen ServiceProvider im normalerweise registrierten AppServiceProvider

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

Nach der Registrierung hat alles gut geklappt.

2. Studieren Sie den Quellcode

Die Anbieterregistrierung in config/app.php ist ungültig, die Registrierung in anderen jedoch ServiceProvider ist gültig. Die Erklärung sind andere Probleme.

Finden Sie die Methode „registerConfiguredProviders“, indem Sie den Quellcode von IlluminateFoundationApplication studieren:

Laravel liest den Anbieterinhalt in config/app.php in dieser Methode und lädt ihn in ProviderRepository.

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

Der entscheidende Punkt ist $this->getCachedServicesPath()  Durch den Quellcode haben wir herausgefunden, dass Laravel basierend auf dem Bootstrap/Cache/den Diensten entscheidet, wie der ServiceProvider registriert wird .php-Datei.

Zu diesem Zeitpunkt dachte ich über den Grund nach, warum der zuvor kommentierte //protected $defer = true; -Code immer noch ungültig war.

Um den kommentierten //protected $defer = true; Code wirksam zu machen, müssen Sie

php artisan clear-compiled 
php artisan optimize

ausführen. Danach ist das Problem gelöst und Sie haben ein tieferes Verständnis des ServiceProvider-Prinzips.

Denken Sie also daran: Wenn Sie das verzögerte Laden von ServiceProvider verwenden möchten, ist es strengstens verboten, Middleware, Routen und andere Vorgänge zu registrieren. Gleichzeitig müssen nach dem Ändern des Defer-Attributwerts php artisan clear-compiled und php artisan optimize ausgeführt werden, um den ServiceProvider-Cache zu aktualisieren.

3. Warum ist die Registrierung bei AppServiceProvider gültig?

Es ist einfach, weil AppServiceProvider den Ladevorgang nicht verzögert, sodass die Ausführung der Registermethode in AppServiceProvider zum Registrieren eines neuen ServiceProviders den Ladevorgang nicht verzögert.

Zusammenfassung

Lazy Loading ServiceProvider mit Vorsicht verwenden

Nach dem Ändern des Verzögerungsattributwerts Sie müssen php artisan clear-compiled und php artisan optimize ausführen, um den ServiceProvider-Cache zu aktualisieren.

Es ist strengstens verboten, Middleware zu registrieren und in einem Lazy-Loaded-ServiceProvider weiterzuleiten.

Artikel, die Sie interessieren könnten:

PHP implementiert den Sortierheap-Sortieralgorithmus

PHP Einfaches Lernen des Auswahlsortieralgorithmus

Detaillierte Erläuterung der WeChat Tiaoyitiao PHP-Code-Implementierung

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Probleme, die beim Einrichten von Lazy Loading während der Entwicklung des Laravel Service Providers aufgetreten sind. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn