


Ausführliche Erläuterung der Probleme, die beim Einrichten von Lazy Loading während der Entwicklung des Laravel Service Providers aufgetreten sind
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

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

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen





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

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

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

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

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

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

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.
