Skip to main content
Per offrire una sintassi Blade da un pacchetto, tieni separati il processo che trasforma il template in PHP e il processo che esegue il PHP generato. Se incorpori i valori di configurazione correnti al momento della compilazione, le view in cache possono continuare a mostrare valori obsoleti. Questa pagina fa riferimento alla documentazione ufficiale di Laravel 13.x e all’implementazione del Framework v13.37.0, e approfondisce le basi dello sviluppo di pacchetti. Per la sintassi ordinaria dei template consulta Blade; per i namespace e la pubblicazione delle view consulta Sovrascrivere e aggiornare le view di un pacchetto.

Distinguere registrazione, compilazione ed esecuzione

La callback passata a Blade::directive() non restituisce il valore da mostrare, ma una stringa con il codice PHP da generare. Anche l’argomento $expression non è un valore già valutato, bensì l’espressione PHP scritta nel template. Anche view:cache esegue la compilazione. Progetta le callback di generazione delle direttive in modo che non recuperino l’utente corrente, non scrivano sul database e non chiamino API esterne.

Registrare con nomi specifici del pacchetto

Come esempio, forniamo @acmeCourierLabel($code), che mostra l’etichetta configurata davanti al codice di spedizione. Si presuppone che il PSR-4 di Composer associ Acme\Courier\ a src/ e che il provider sia registrato tramite rilevamento automatico o manualmente.
src/CourierServiceProvider.php
In questo esempio il contratto di configurazione prevede che courier.label sia una stringa e courier.enabled un booleano. Per la distribuzione e il merge dei file di configurazione consulta Merge e cache della configurazione dei pacchetti. Esegui la registrazione nel normale boot() del provider, senza racchiuderla in una condizione runningInConsole(). La stessa estensione serve sia per il rendering via HTTP sia per view:cache di Artisan. Evita anche di rendere differito un provider che registra solo estensioni Blade, perché non verrebbe avviato finché non si risolve un altro servizio.

Gli argomenti arrivano come espressioni, non come valori

Con questo template, la callback riceve la stringa $code. Il PHP generato ha la forma seguente.
config() e $code vengono valutati nel momento in cui questo PHP viene eseguito. È diverso da un’implementazione in cui la callback stessa legge config() e restituisce una stringa fissa. Il metodo callCustomDirective() esaminato rimuove le parentesi tonde esterne, applica trim all’espressione e la passa alla callback. Non converte l’argomento in un valore PHP né lo suddivide in argomenti separati. Questo esempio viene esposto come una sintassi che accetta un’unica espressione obbligatoria. Se devi gestire più argomenti, non limitarti a fare explode() sulle virgole: le virgole possono comparire anche all’interno di array, chiamate di metodo e stringhe letterali. Se vuoi gestire attributi o HTML complesso, fornire la funzionalità come componente Blade rende più facile separare le responsabilità.
Le espressioni del template sono codice PHP scritto da sviluppatori fidati. Non costruire il sorgente di un template a partire dall’input degli utenti. Inoltre, l’echo di una direttiva personalizzata non riceve automaticamente l’escape del normale {{ }}. In questo esempio il PHP generato chiama esplicitamente e().

Anche i conflitti di nome sono un problema di compatibilità

directive() salva l’handler in un array usando il nome come chiave. Con lo stesso nome sovrascrive la registrazione precedente, e compileStatement() sceglie le direttive personalizzate prima dei metodi di conversione predefiniti. Anche i test ufficiali includono un caso in cui una registrazione personalizzata sovrascrive foreach. Evita nomi generici come label o enabled e i nomi predefiniti, e aggiungi un prefisso specifico del pacchetto. Tratta i nomi e gli argomenti che gli utenti usano nei template come API pubblica e, quando li modifichi, fornisci una procedura di migrazione.

Valutare le condizioni a runtime con Blade::if

La condizione registrata nel provider precedente si può usare così.
Blade::if() salva la callback della condizione e registra le direttive di apertura, unless, else e chiusura. In questo esempio la parte di apertura viene convertita nel PHP seguente.
La callback che controlla la configurazione viene chiamata da check() a runtime. Non si tratta di un processo che fissa il risultato true o false al momento della compilazione. Anche i processi HTTP che usano view compilate devono avere registrata la callback della condizione. Questa sintassi serve a cambiare ciò che viene mostrato, non ad autorizzare le operazioni di spedizione. Applica il controllo degli accessi anche nelle route o nelle operazioni stesse.

L’aggiornamento di un pacchetto non rigenera sempre le view

Il metodo Compiler::isExpired() esaminato controlla l’esistenza della cache e, a seconda della configurazione, gli orari di modifica della view sorgente e del file compilato. Non tiene traccia, come file dipendenti, delle modifiche alle direttive scritte nel provider. Anche la documentazione ufficiale indica di eliminare la cache con view:clear dopo aver modificato la logica di una direttiva. Eseguilo nel processo di deploy dell’applicazione che usa il pacchetto, dopo aver allineato il pacchetto aggiornato e le view dell’utente.
Esegui view:cache quando vuoi precompilare le view in produzione. Non svuotare la cache a ogni boot() del pacchetto e non modificare senza permesso il processo di deploy dell’applicazione durante l’installazione. Anche l’aggiornamento della cache di configurazione e il ricaricamento dei processi residenti devono seguire la normale procedura di deploy dell’ambiente dell’utente.

Verificare separatamente il risultato della compilazione e del rendering

Per prima cosa, verifica il PHP generato in un’applicazione Laravel di test in cui è registrato il provider precedente. Il metodo seguente va aggiunto a un test Feature che estende Tests\TestCase.
Questo test verifica il contratto di generazione del PHP, ma non l’escape a runtime né i rami condizionali. In un pacchetto reale aggiungi anche verifiche sul rendering delle view e sugli aggiornamenti.

Pagine correlate

Sovrascrivere e aggiornare le view di un pacchetto

Scopri l’ordine di ricerca dei namespace e come mantenere i template pubblicati.

Cache dei pacchetti e integrazione con optimize

Scopri come integrare la creazione e l’eliminazione delle cache personalizzate nel processo di deploy.

Fonti primarie consultate

Ultima modifica il 17 ottobre 2026