Inhaltsverzeichnis
Artikel, die Sie interessieren könnten:
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

Jul 03, 2018 pm 05:50 PM
laravel service 延迟加载

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];
 }
}
Nach dem Login kopieren

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 dem Login kopieren

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());
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie bekomme ich den Rückgabecode, wenn das Senden von E -Mails in Laravel fehlschlägt? Wie bekomme ich den Rückgabecode, wenn das Senden von E -Mails in Laravel fehlschlägt? Apr 01, 2025 pm 02:45 PM

Methode zum Abholen des Rücksendecode, wenn das Senden von Laravel -E -Mails fehlschlägt. Wenn Sie Laravel zur Entwicklung von Anwendungen verwenden, stellen Sie häufig Situationen auf, in denen Sie Überprüfungscodes senden müssen. Und in Wirklichkeit ...

Laravel -Zeitplanaufgabe wird nicht ausgeführt: Was soll ich tun, wenn die Aufgabe nicht nach Zeitplan ausgeführt wird: Befehl ausführen? Laravel -Zeitplanaufgabe wird nicht ausgeführt: Was soll ich tun, wenn die Aufgabe nicht nach Zeitplan ausgeführt wird: Befehl ausführen? Mar 31, 2025 pm 11:24 PM

Laravel -Zeitplan -Aufgabe Ausführen nicht reagierende Fehlerbehebung Bei Verwendung der Zeitplanung von Laravel -Zeitplänen werden viele Entwickler auf dieses Problem stoßen: Zeitplan: Run ...

Wie kann man in Laravel mit der Situation umgehen, in der Überprüfungscodes nicht per E -Mail gesendet werden? Wie kann man in Laravel mit der Situation umgehen, in der Überprüfungscodes nicht per E -Mail gesendet werden? Mar 31, 2025 pm 11:48 PM

Die Methode zum Umgang mit Laravels E -Mail -Versagen zum Senden von Verifizierungscode besteht darin, Laravel zu verwenden ...

So implementieren Sie die benutzerdefinierte Tabellenfunktion des Klickens, um Daten im DCAT -Administrator hinzuzufügen? So implementieren Sie die benutzerdefinierte Tabellenfunktion des Klickens, um Daten im DCAT -Administrator hinzuzufügen? Apr 01, 2025 am 07:09 AM

So implementieren Sie die Tabellenfunktion von benutzerdefiniertem Klicken, um Daten in dcatadmin (laravel-admin) hinzuzufügen, wenn Sie DCAT verwenden ...

Laravel Redis -Verbindungsfreigabe: Warum wirkt sich die Auswahlmethode auf andere Verbindungen aus? Laravel Redis -Verbindungsfreigabe: Warum wirkt sich die Auswahlmethode auf andere Verbindungen aus? Apr 01, 2025 am 07:45 AM

Die Auswirkungen des Austauschs von Redis -Verbindungen im Laravel -Framework und der Auswahl von Methoden bei Verwendung von Laravel -Framework und Redis können Entwickler auf ein Problem stoßen: Durch Konfiguration ...

Laravel Multi-Tenant-Erweiterungsstanz/Mietverhältnis: Wie passen Sie die Host-Adresse einer Mieterdatenbankverbindung an? Laravel Multi-Tenant-Erweiterungsstanz/Mietverhältnis: Wie passen Sie die Host-Adresse einer Mieterdatenbankverbindung an? Apr 01, 2025 am 09:09 AM

Benutzerdefinierte Mieterdatenbankverbindung in Laravel Multi-Tenant-Erweiterungspaket Stanz/Mietverhältnis beim Erstellen von Multi-Mandanten-Anwendungen mit Laravel Multi-Tenant-Erweiterungspaket Stanz/Mietverhältnis, ...

Laravel eloquent orm bei bangla partieller Modellsuche) Laravel eloquent orm bei bangla partieller Modellsuche) Apr 08, 2025 pm 02:06 PM

Laraveleloquent-Modellab Abruf: Das Erhalten von Datenbankdaten Eloquentorm bietet eine prägnante und leicht verständliche Möglichkeit, die Datenbank zu bedienen. In diesem Artikel werden verschiedene eloquente Modellsuchtechniken im Detail eingeführt, um Daten aus der Datenbank effizient zu erhalten. 1. Holen Sie sich alle Aufzeichnungen. Verwenden Sie die Methode All (), um alle Datensätze in der Datenbanktabelle zu erhalten: UseApp \ Models \ post; $ posts = post :: all (); Dies wird eine Sammlung zurückgeben. Sie können mit der Foreach-Schleife oder anderen Sammelmethoden auf Daten zugreifen: foreach ($ postas $ post) {echo $ post->

Was ist besser, Django oder Laravel? Was ist besser, Django oder Laravel? Mar 28, 2025 am 10:41 AM

Sowohl Django als auch Laravel sind Full-Stack-Frameworks. Django eignet sich für Python -Entwickler und komplexe Geschäftslogik, während Laravel für PHP -Entwickler und elegante Syntax geeignet ist. 1.Django basiert auf Python und folgt der "batteriebetriebenen" Philosophie, die für schnelle Entwicklung und hohe Parallelität geeignet ist. 2. Laravel basiert auf PHP, der die Entwicklererfahrung betont und für kleine bis mittlere Projekte geeignet ist.

See all articles