Heim >Backend-Entwicklung >PHP-Tutorial >Beim Entwickeln und Einrichten von Lazy Loading im Laravel Service Provider sind Probleme aufgetreten

Beim Entwickeln und Einrichten von Lazy Loading im Laravel Service Provider sind Probleme aufgetreten

小云云
小云云Original
2018-01-08 10:11:141714Durchsuche

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

Laravel Service Providers bindet mehrere Implementierungen. Was soll ich tun, wenn Abhängigkeitsinjektion verwendet wird? ? Bestimmen Sie, welche Klasse instanziiert wird?

Laravel Service Provider-Lösungen für Probleme, die beim Einrichten von Lazy Loading während der Entwicklung auftreten

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!

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