13.x und für die Framework-Implementierung das aktuelle Release v13.34.0.
loadRoutesFrom lädt nur die Datei
ServiceProvider::loadRoutesFrom() lädt die Route-Datei nicht, wenn die Anwendung CachesRoutes implementiert und routesAreCached() true zurückgibt. In allen anderen Fällen wird die angegebene Datei per require eingebunden.
Die Methode selbst fügt weder ein Präfix für URIs oder Routennamen noch einen Controller-Namespace oder Middleware hinzu. Sie veröffentlicht auch keine Dateien und ergänzt keine Routen in einem bestehenden Cache.
Das Diagramm geht von einer Standard-Laravel-Anwendung aus. Es gibt keinen eigenen Cache für das Paket. Die Routen des Pakets sind im Route-Cache der gesamten Anwendung enthalten.
Konfiguration und Registrierung trennen
Im folgenden Beispiel erstellen wir einen öffentlichen Endpunkt, der meldet, ob das Paket antwortbereit ist. Vorausgesetzt wird, dassAcme\Courier\ per PSR-4 in Composer auf src/ abgebildet ist und der Provider über die automatische Erkennung oder manuell registriert wird.
config/courier.php
register() zusammen, die Routen laden Sie in boot(). Machen Sie einen Provider, der HTTP-Routen registriert, nicht zu einem DeferrableProvider. Sonst ist nicht garantiert, dass der Provider gestartet ist, wenn die Routen gebraucht werden.
src/CourierServiceProvider.php
routes/web.php
src/Http/Controllers/StatusController.php
/acme-courier/status, der Routenname acme-courier.status. Wenn Sie URLs mit route('acme-courier.status') erzeugen, kann der aufrufende Code denselben Routennamen verwenden, auch wenn sich das URI-Präfix ändert. name() einer Gruppe verkettet die Zeichenketten unverändert, deshalb geben Sie auch den abschließenden . an.
web ersetzt keine Authentifizierung oder Autorisierung. Dieses Beispiel ist ein öffentlicher Endpunkt ohne vertrauliche Daten. Für Endpunkte, die Daten von Nutzern zurückgeben, sehen Sie zusätzlich eine passende Authentifizierungs-Middleware und Autorisierungsprüfungen vor.Kollisionen bei URIs und Routennamen getrennt vermeiden
Das URI-Präfix und das Präfix für Routennamen sind zwei verschiedene Mechanismen. Wenn Sie nur eines davon setzen, verhindern Sie keine Kollisionen beim anderen.AbstractRouteCollection wirft beim Erstellen der Routensammlung für den Cache eine LogicException, wenn eine andere Route bereits denselben Namen trägt. Dass sich URLs beim normalen Start erzeugen ließen, garantiert also nicht, dass sich die Routen cachen lassen. Auch zwei Routen mit unterschiedlichen URIs verursachen ein Problem, wenn sie denselben Namen haben.
Machen Sie das Überschreiben von Routen der nutzenden Anwendung über die Registrierungsreihenfolge nicht zum Erweiterungsweg Ihres Pakets. Stellen Sie bei Bedarf eine Einstellung zum Deaktivieren der Routen sowie einen Service bereit, den Nutzer aus eigenen Routen aufrufen können.
Die Konfiguration zum Zeitpunkt der Cache-Erstellung bleibt in den Routendefinitionen
RouteCacheCommand führt zuerst route:clear aus, startet dann eine neue Anwendung und sammelt die Routen. Diese Routen werden für die Serialisierung vorbereitet, und das kompilierte Ergebnis wird in die Cache-Datei geschrieben.
Dabei wird auch die Route-Datei des Pakets geladen. Präfix und Registrierung richten sich daher nach der Konfiguration zum Zeitpunkt der Cache-Erstellung. Bei späteren Starts lädt loadRoutesFrom() die Datei nicht mehr, und es werden die gecachten Routen verwendet.
Registrieren Sie Routen nicht abhängig von Bedingungen, die sich pro Anfrage ändern, etwa Benutzer oder Mandanten. Solche Bedingungen werden in der CLI-Umgebung ausgewertet, in der der Cache erstellt wird. Registrieren Sie Routen mit einer stabilen Konfiguration und entscheiden Sie über den Zugriff mit Middleware oder einer Autorisierung im Controller.
Beim Deployment zuerst die Konfiguration festlegen
Wenn Code und Konfiguration aktualisiert sind, erstellen Sie die Caches in Setups mit Konfigurations-Cache in der folgenden Reihenfolge neu. Nehmen Sie diese Schritte in den Deployment-Prozess der nutzenden Anwendung auf.route:cache aus, während ein alter Konfigurations-Cache besteht, werden auch die Routen mit der alten Konfiguration erstellt. Wenn Sie nur config:cache erneut ausführen, wird der Route-Cache nicht aktualisiert. Mit -vv sehen Sie auch den Inhalt der Middleware-Gruppen.
Um das Verhalten während der Entwicklung ohne Cache zu prüfen, leeren Sie bei Bedarf beide Caches.
Kombinationen, die Sie vor einem Release prüfen
Prüfen Sie zusätzlich zu den Tests des Pakets die folgenden Kombinationen in einer nutzenden Laravel-13-Anwendung. Testen Sie nicht nur die Routenregistrierung im Speicher, sondern auch den Weg, auf dem Artisan eine neue Anwendung startet.- Ohne Cache antwortet
/acme-courier/status, und Routenname sowie Middleware entsprechen den Erwartungen. route:cacheläuft erfolgreich, und auch nach einem neuen Start antwortet die Route unter derselben URI und demselben Routennamen.- Nach einer Änderung des Präfixes und dem Neuerstellen des Caches antwortet die neue URI, und unter der alten URI gibt es keine Paketroute mehr.
- Nach dem Deaktivieren und dem Neuerstellen des Caches erscheint die Route nicht in
route:list --name=acme-courier. - URIs und Routennamen kollidieren nicht mit der nutzenden Anwendung oder anderen Paketen.
Verwandte Seiten
Routing
Grundlagen zu Routengruppen, benannten Routen und der Routenliste.
Paketkonfiguration zusammenführen und cachen
Update-Schritte, die veröffentlichte Konfigurationen und den Konfigurations-Cache berücksichtigen.
Deferred Service Provider
Warum Provider, die Routen registrieren, nicht verzögert geladen werden sollten.
Versionskompatibilität von Paketen verwalten
Verknüpfen Sie Änderungen an der öffentlichen API mit Ihrer Release-Strategie und kontinuierlicher Prüfung.
Herangezogene Primärquellen
- Offizielle Laravel-Dokumentation: Paket-Routen
- Offizielle Laravel-Dokumentation: Routing
- ServiceProvider: Implementierung von loadRoutesFrom
- RouteServiceProvider: Laden des Caches
- RouteCacheCommand: Sammeln in einer neuen Anwendung und Speichern
- AbstractRouteCollection: Erkennung doppelter Routennamen