Skip to main content
Per l’uso di base fai riferimento alla pagina della guida. In questa pagina presentiamo pattern pratici non presenti nella documentazione ufficiale.

Scope di team in un SaaS multi-tenant

Se vuoi gestire i flag a livello di team (tenant) invece che di singolo utente, cambia lo scope predefinito in team.
Basta questo perché Feature::active('billing-v2') si riferisca automaticamente al team corrente. Finché i membri appartengono allo stesso team ottengono lo stesso risultato, garantendo coerenza della UI. Esempio di rollout graduale in base alla data di iscrizione del team.
Se vuoi abilitarlo solo per team specifici (per esempio anteprima per clienti enterprise):

Kill switch di emergenza (uso del metodo before)

Quando in produzione emerge un bug, puoi disabilitare istantaneamente una funzionalità senza rollback del codice. Aggiungendo il metodo before a una feature basata su classe, il controllo viene eseguito prima del valore in storage.
Impostando la variabile d’ambiente FEATURES_NEW_CHECKOUT_DISABLED=true puoi fermare la funzionalità senza toccare il DB. Un kill switch senza deploy.
Se before restituisce null, viene eseguito resolve(). Se restituisce false, viene trattato immediatamente come inattivo. Quando non è un’emergenza, restituisci null.

Rollout schedulato

Se vuoi pubblicare automaticamente a tutti gli utenti a una data e ora specifiche, puoi implementarlo con il metodo before.
Così, superato il 2025-04-01, la funzionalità viene automaticamente pubblicata a tutti. Automatizzabile senza deploy, senza DB, senza comandi Artisan.

Dark launch (Shadow Mode)

Pattern che fa girare una nuova logica sui dati di produzione senza mostrarla agli utenti, confrontando i risultati con la logica precedente. Se non ci sono problemi, basta accendere il flag per completare il rilascio.
Una volta verificato dai log che non ci sono più differenze, basta cambiare il flag in recommendation-v2.

Raccolta dei risultati A/B test tramite eventi

La documentazione ufficiale accenna all’evento FeatureRetrieved, ma non mostra un pattern reale di aggregazione A/B. L’evento FeatureResolved si attiva solo la prima volta che il valore della feature viene risolto. Usalo per registrare l’assegnazione della variante a un utente.
Se registri separatamente il momento della conversione, potrai aggregare il tasso di conversione per ogni variante.
Differenza tra FeatureResolved e FeatureRetrieved: FeatureResolved si attiva solo alla prima valutazione, FeatureRetrieved a ogni verifica. Per registrare l’assegnazione è più adatto FeatureResolved, per tracciare le page view FeatureRetrieved.

Scope nei job in coda

Nei job di coda non esiste un utente autenticato, quindi il controllo delle feature può comportarsi in modo inatteso. Passa esplicitamente lo scope al job.
Puoi anche valutare il flag al momento del dispatch del job e passarlo al job stesso.

UI di gestione tramite comando Artisan

Se crei un semplice comando Artisan per gestire i flag, puoi manipolare quelli di produzione senza deploy.

Refactoring sicuro dei nomi delle feature (attributo Name)

Quando rinomini una feature class, se cambia il nome del flag salvato nel DB tutti i flag degli utenti vengono resettati. Con l’attributo Name fissa il nome usato per lo storage.
In questo modo puoi rifattorizzare liberamente il nome della classe mantenendo i dati del DB.

Conclusioni

Una volta padroneggiate le basi della documentazione ufficiale, il vero valore di Pennant emerge con i pattern seguenti.

Guida Laravel Pennant

Per l’installazione e l’uso di base fai riferimento alla pagina della guida.
Ultima modifica il 13 luglio 2026