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.
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!