Laravel Nova 4 cover image

Laravel Nova 4

alberto • April 13, 2022

release nova

Nova 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.

Interfaccia responsive

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.

Dark Mode

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.

Brand configurabile

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.

Relazioni collassabili

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.

Notifiche in-app

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.

Impersonation

Menu personalizzabili

Altra feature piú obbligatoria che innovativa: la possibilità di personalizzare i menu, raggruppando le risorse in sezioni e gruppi. Era ora :)

Menu personalizzabili

Nuova metrica: progress

La nuova metrica progress permette di avere una barra di avanzamento in percentuale, da mostrare all'interno di una particolare risorsa.

Metrica progress

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.

Preview

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.

inline per relazioni hasone

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:

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:

Mi riservo di dare una valutazione complessiva tra qualche mese, dopo aver utilizzato piú intensamente questa versione.