13.x, mentre per l’implementazione del framework si fa riferimento all’ultima release, v13.34.0.
loadRoutesFrom si limita a caricare il file
ServiceProvider::loadRoutesFrom() non carica il file di route se l’applicazione implementa CachesRoutes e routesAreCached() restituisce true. Negli altri casi esegue il require del file indicato.
Il metodo in sé non aggiunge prefissi di URI o di nome delle route, namespace dei controller né middleware. Non pubblica nemmeno file e non aggiunge route a una cache esistente.
Il diagramma presuppone un’applicazione Laravel standard. Non esiste una cache dedicata al pacchetto: le route del pacchetto sono incluse nella cache delle route dell’intera applicazione.
Separare configurazione e registrazione
Nell’esempio seguente creiamo un endpoint pubblico che indica se il pacchetto è in grado di rispondere. Si presuppone che il PSR-4 di Composer mappiAcme\Courier\ su src/ e che il provider sia registrato tramite auto-discovery o manualmente.
config/courier.php
register(), il caricamento delle route in boot(). Non rendere DeferrableProvider un provider che registra route HTTP: non ci sarebbe più la garanzia che il provider venga avviato nel momento in cui le route servono.
src/CourierServiceProvider.php
routes/web.php
src/Http/Controllers/StatusController.php
/acme-courier/status e il nome della route è acme-courier.status. Se generi l’URL con route('acme-courier.status'), il codice chiamante può continuare a usare lo stesso nome di route anche quando il prefisso dell’URI cambia. Il name() del gruppo concatena le stringhe così come sono, quindi specifica anche il . finale.
web non sostituisce autenticazione e autorizzazione. Questo esempio è un endpoint pubblico che non contiene informazioni riservate. Per gli endpoint che restituiscono dati degli utenti, prevedi separatamente middleware di autenticazione e logica di autorizzazione adeguati ai requisiti.Prevenire separatamente i conflitti di URI e di nome delle route
Il prefisso dell’URI e il prefisso del nome delle route sono meccanismi distinti. Aggiungerne solo uno non impedisce i conflitti dell’altro.
Quando crea la collezione di route per la cache,
AbstractRouteCollection lancia una LogicException se lo stesso nome è assegnato a route diverse. Il fatto che “con un avvio normale l’URL viene generato” non garantisce che le route siano memorizzabili in cache. Anche due route con URI diversi creano problemi se hanno lo stesso nome.
Non usare come meccanismo di estensione del pacchetto la sovrascrittura delle route dell’applicazione in base all’ordine di registrazione. Se necessario, fornisci un’impostazione per disattivare le route e un servizio che gli utenti possano chiamare da route proprie.
La configurazione al momento della creazione della cache resta nelle definizioni delle route
RouteCacheCommand esegue prima route:clear, poi avvia una nuova applicazione e raccoglie le route. Prepara quelle route in una forma serializzabile e scrive il risultato compilato nel file di cache.
In questa fase viene caricato anche il file di route del pacchetto, quindi il prefisso e la registrazione o meno delle route dipendono dalla configurazione al momento della creazione della cache. Negli avvii successivi loadRoutesFrom() non carica il file e vengono usate le route in cache.
Non registrare le route in base a condizioni che cambiano a ogni richiesta, come l’utente o il tenant. Quelle condizioni vengono valutate nell’ambiente CLI al momento della creazione della cache. Registra le route con una configurazione stabile e decidi se consentire l’accesso tramite middleware o autorizzazione nel controller.
Nel deploy, definisci prima la configurazione
Dopo aver aggiornato codice e configurazione, nelle configurazioni che usano la cache della configurazione ricrea le cache nell’ordine seguente. Includi questi passaggi nel processo di deploy dell’applicazione che usa il pacchetto.route:cache mentre resta una vecchia cache della configurazione, anche le route vengono create con la vecchia configurazione. Rieseguire solo config:cache non aggiorna la cache delle route. Con -vv puoi verificare anche il contenuto dei gruppi di middleware.
Per verificare il comportamento senza cache durante lo sviluppo, cancella entrambe le cache se necessario.
Combinazioni da verificare prima del rilascio
Oltre ai test del pacchetto, verifica le seguenti combinazioni in un’applicazione Laravel 13 che lo usa. Non limitarti alla registrazione delle route in memoria: includi anche il percorso in cui Artisan avvia una nuova applicazione.- Senza cache,
/acme-courier/statusrisponde e il nome della route e i middleware sono quelli previsti. route:cacheva a buon fine e anche in un nuovo avvio la route risponde con lo stesso URI e lo stesso nome.- Modificando il prefisso e ricreando la cache, il nuovo URI risponde e la route del pacchetto sul vecchio URI scompare.
- Disattivando le route e ricreando la cache, la route non compare in
route:list --name=acme-courier. - URI e nomi delle route non entrano in conflitto con l’applicazione o con altri pacchetti.
Pagine correlate
Routing
Le basi di gruppi di route, route con nome e visualizzazione dell’elenco.
Merge e cache della configurazione dei pacchetti
Una procedura di aggiornamento che tiene conto della configurazione pubblicata e della cache della configurazione.
Service provider differiti
Perché non rendere differito un provider che registra route.
Gestire la compatibilità tra versioni dei pacchetti
Collega le modifiche all’API pubblica alla politica di rilascio e alla verifica continua.
Fonti primarie consultate
- Documentazione ufficiale di Laravel: route dei pacchetti
- Documentazione ufficiale di Laravel: routing
- ServiceProvider: implementazione di loadRoutesFrom
- RouteServiceProvider: caricamento della cache
- RouteCacheCommand: raccolta e salvataggio in una nuova applicazione
- AbstractRouteCollection: rilevamento dei nomi di route duplicati