
Laravel Nova 4
alberto • April 13, 2022
release novaNova ha raggiunto finalmente la versione 4. L'attesa era abbastanza elevata dato che gli ultimi rilasci della versione 3 erano sempre meno frequenti.
Le principali novità
Premetto che non ci sono novità che gridano al miracolo. Il team di sviluppo si è concentrato piú sulla stabilità e sull'offerta di un prodotto bello da vedere. Se Nova 3 vi è piaciuto, vi piacerà sicuramente anche questa versione. Ma se il progetto non vi aveva convinto, allora difficilmente questo rilascio vi farà cambiare idea.
Interfaccia responsive
Finalmente Nova sarà utilizzabile anche da dispositivi portatili. Questa piú che una novità è una correzione di una mancanza precedente.
Dark Mode
In linea con la moda del momento, anche Laravel Nova si adegua e introduce la modalità dark, automatica in base alle impostazioni del device o configurabile direttamente da interfaccia web.
Brand configurabile
Tramite una serie di configurazioni brand
sarà possibile modificare non solo il logo, ma anche colori all'interno del backoffice senza l'obbligo di creare un nuovo tema.
Relazioni collassabili
In ottica di migliorare i tempi di caricamento delle pagine, i pannelli di relazione dei nostri modello potranno essere chiusi cosī da alleggerire il numero di chiamate HTTP al server.
Callback sulle azioni e Azioni batch
Grazie al metodo then
sarà possibile aggiungere codice addizionale alle nostre Actions, mantenendo il codice piú disaccoppiato. Utile in caso sia necessario inviare notifiche al termine di una azione senza modificare l'azione stessa.
public function actions(NovaRequest $request)
{
return [
(new Actions\EmailAccountProfile)->then(function ($models) {
$models->each(function ($model) {
//
});
}),
];
}
Sempre in questa ottica sarà possibile sfruttare il batching delle azioni presente nativamente su Laravel, sempre per eseguire codice addizionale una volta che un'azione è stata portata a termine:
public function withBatch(ActionFields $fields, PendingBatch $batch)
{
$batch->then(function (Batch $batch) {
// All jobs completed successfully...
$selectedModels = $batch->resourceIds;
})->catch(function (Batch $batch, Throwable $e) {
// First batch job failure detected...
})->finally(function (Batch $batch) {
// The batch has finished executing...
});
}
4 nuovi Fields
Nuovi field nativi ampliano l'assortimento di Nova:
Color
offre un picker per selezionare un colore, UiAvatar
permette di mostrare l'avatar utilizzando la piattaforma ui-avatars.com, MultiSelect
è un dropdown a selezione multipla e URL
permette di renderizzare link cliccabili al posto di semplice testo.
Field dinamici
Questa rappresenta forse la novità di rilievo di questo rilascio.
Questa nuova feature permette infatti di creare relazioni tra i field di una risorsa in modo da farli apparire/scomparire sulla base del valore di un altro campo:
Select::make('Purchase Type', 'type')
->options([
'personal' => 'Personal',
'gift' => 'Gift',
]),
Text::make('Recipient')
->readonly()
->dependsOn(
['type'],
function (Text $field, NovaRequest $request, FormData $formData) {
if ($formData->type === 'gift') {
$field->readonly(false)->rules(['required', 'email']);
}
}
),
In questo caso, il campo Recipient viene reso editabile e obbligatorio solamente se il valore della prima tendina è gift
.
La sintassi di questa feature, bisogna ammetterlo, non è chiarissima in prima battuta, ma non è per forza un male dato che l'obiettivo degli sviluppatori è stato quello di rendere il comportamento il piú flessibile in assoluto. Essendo un applicativo di backoffice è corretto avere come focus principale quello della flessibilità.
Field filtrabili
Seconda novità di peso sono i campi filterable
.
Qualsiasi field definito nella risorsa puó essere trasformato in un campo filtrabile (tramite appunto il metodo filterable
). In automatico Nova posizionerà questi campi all'interno del dropdown dei filtri senza la necessità di ridefinirli all'interno del metodo filters
.
Notifiche in-app
Dalla versione 4 potremo mandare notifiche in-app per i nostri utenti. Utili soprattutto per segnalare la conclusione di job asincroni. Le notifiche vengono inviate tramite l'engine delle notifiche standard di Laravel grazie alla classe NovaNotification
.
Impersonation
Una nuova azione sarà disponibile sulla risorsa User: la possibilità di impersonare un determinato utente. La feature è molto comoda in quanto permette di testare con estrema facilità eventuali Policy o ACL che sono impostate nell'applicativo, senza dover per forza effettuare un logout.
Menu personalizzabili
Altra feature piú obbligatoria che innovativa: la possibilità di personalizzare i menu, raggruppando le risorse in sezioni e gruppi. Era ora :)
Nuova metrica: progress
La nuova metrica progress permette di avere una barra di avanzamento in percentuale, da mostrare all'interno di una particolare risorsa.
Duplicazione risorse
Funzionalità a mio avviso molto comoda, soprattutto in ambito CMS: tramite una azione possiamo mostrare all'utente una form di creazione già prepopolata sulla base di una risorsa già creata.
Pupup di Preview
Una ulteriore azione disponibile sui modelli permette di mostrare, nella index page, una popup con campi addizionali rispetto a quelli presenti in griglia. Molto comoda per avere un dettaglio di una particolare risorsa senza dover cambiare pagina.
Supporto per HasOne::ofMany
Il nuovo tipo di relazione ofMany viene finalmente supportato all'interno di Nova.
Creazione in-line per relazioni HasOne
Qualora una risorsa avesse una relazione hasOne con un'altra risorsa, sarà possibile, creare la risorsa figlia direttamente nella form della risorsa padre.
Miglioramento engine di ricerca
Due novità sul fronte ricerca: possibilità di usare indici full-text invece delle semplici LIKE
e ricerca all'interno di colonne JSON.
Una nuova licenza
La versione 4.0, oltre a tutte le novità descritte, porta con se la necessità di una nuova licenza. Qualora aveste acquistato una licenza per la prima generazione di Laravel Nova, chiamata Orion (ovvero le versioni da 0.x a 3.x), sarà comunque necessario il pagamento di una nuova licenza per questa seconda generazione, denominata Silver Surfer.
Esistono due scenari di pricing:
- 99$ per un singolo progetto
- 299$ per progetti illimitati e supporto email
Cosa ne penso
Come anticipato all'inizio, non è un rilascio che fa gridare al miracolo. Le novità introdotte, seppur in numero considerevole, non sono rivoluzionarie ma sono volte piú che altro a compensare alcune mancanze presenti nelle prime versioni di Nova.
In particolare il layout responsive e una maggior personalizzazione del menu erano delle basic feature sacrosante che sarebbero dovute forse arrivare anche prima.
Le altre novità sono senza dubbio carine e permettono di aumentare la flessibilità dello strumento, che è, a mio avviso, l'elemento sul quale Nova ha ancora tanto da migliorare.
Spulciando nel codice mi sono peró accorto che ci sono un po' di cambiamenti negli internals che sono giustamente poco sponsorizzati perchè piu tecnici, ma che sul lungo periodo potranno essere elementi vincenti.
In particolare mi sono dedicato a due aspetti:
- una mia battaglia è stata vinta, e mi piace credere che sia per merito mio
- un bug segnalato da me che è stato risolto nel modo che avevo suggerito
Mi riservo di dare una valutazione complessiva tra qualche mese, dopo aver utilizzato piú intensamente questa versione.