Dieser Artikel führt Sie hauptsächlich in die Probleme ein, die beim Entwickeln und Einrichten von Laravel Service Provider auftreten. Der Artikel stellt es ausführlich anhand von Beispielcode vor. Es hat einen gewissen Referenz- und Lernwert für alle, die es lernen oder arbeiten möchten Brauchen Sie es, können Sie mit dem Editor einen Blick darauf werfen. Ich hoffe, es hilft allen.
Vorwort
In diesem Artikel werden hauptsächlich einige Probleme vorgestellt, die beim Einrichten von Laravel Service Provider auftreten. Dieser Artikel ist auf tatsächliche Projektanforderungen zurückzuführen Bei Verwendung des Logger-Pakets habe ich festgestellt, dass das Setzen des ServiceProvider-Defer-Attributs auf „true“ dazu führt, dass die in der Register-Methode 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. Ich habe den geschützten Code „$defer = true“ sofort auskommentiert Prompt-Datenbanklogger-Klasse nicht gefunden. Dies zeigt an, dass Laravel diesen ServiceProvider nicht registriert hat.
Der nächste Schritt besteht darin, dieses Problem zu lösen:
1 Überprüfen Sie, ob ein Problem mit dem Code selbst
Registrieren Sie Ihren eigenen ServiceProvider im normalerweise registrierten AppServiceProvider
public function register() { // $this->app->register(\Ibrand\DatabaseLogger\ServiceProvider::class); }
Nach der Registrierung ist alles normal.
2. Studieren Sie den Quellcode
Die Anbieterregistrierung in config/app.php ist ungültig, aber die Registrierung in anderen ServiceProvidern ist gültig, was auf ein anderes Problem hinweist.
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 Fokus liegt auf $this->getCachedServicesPath(). Durch den Quellcode haben wir herausgefunden, dass Laravel anhand der Datei bootstrap/cache/services.php bestimmt, wie der ServiceProvider registriert wird.
Zu diesem Zeitpunkt dachte ich über den Grund nach, warum der Code //protected $defer = true; immer noch ungültig war, nachdem ich ihn zuvor kommentiert hatte.
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 einen tieferen Einblick Verständnis des Prinzips des ServiceProviders.
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 Sie nach dem Ändern des Defer-Attributwerts PHP Artisan Clear-Compiled und PHP Artisan Optimize ausführen, um den ServiceProvider-Cache zu aktualisieren.
3. Warum ist die Registrierung bei AppServiceProvider gültig?
Das ist einfach, da AppServiceProvider den Ladevorgang nicht verzögert. Daher führt die Ausführung der Registermethode in AppServiceProvider zum Registrieren eines neuen ServiceProviders nicht zu einer Verzögerung des Ladevorgangs.
Zusammenfassung
Lazy Loading ServiceProvider mit Vorsicht verwenden
Nach dem Ändern des Defer-Attributwerts müssen Sie PHP Artisan Clear-Compiled und PHP Artisan ausführen optimieren, um den ServiceProvider-Cache zu aktualisieren.
Es ist strengstens verboten, Middleware zu registrieren und in einem Lazy-Loaded ServiceProvider weiterzuleiten.
Verwandte Empfehlungen:
Laravel Service Providers-Problem
Das obige ist der detaillierte Inhalt vonBeim Entwickeln und Einrichten von Lazy Loading im Laravel Service Provider sind Probleme aufgetreten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!