Creare un Admin per Laravel con Orchid CRUD. Ecco com’è andata

1
2429

Torno di nuovo a scrivere di Orchid, il progetto di Alexandr Chernyaev dedicato alla costruzione di pannelli di amministrazione con Laravel. Sto continuando ad usarlo e, devo ammetterlo, mi ci sto appassionando.

Il progetto è ben fatto, funziona bene ed ha una logica che mi piace molto.

Nel primo articolo avevo riportato le parole del suo autore riguardo all’aspetto CRUD, fondamentale per un qualsiasi pannello di amministrazione. Le sue parole sono molto specifiche: “this is not a CRUD solution”.

Tuttavia… è successa una cosa interessante.

Un modulo CRUD c’è!

Qualche giorno fa, dopo aver letto questo articolo (good catch, apprezzo gli sviluppatori che monitorano le conversazioni sui propri progetti) Alexandr mi ha contattato, per spiegarmi che esiste anche un modulo aggiuntivo per Orchid da usare specificatamente per fare CRUD.

Il nome è… beh, CRUD ovviamente! E si può trovare qui.

Arriviamo alla domanda fatidica: è un buon sostituto gratuito di Nova?

La risposta è . Vi spiego come sono giunto a questa conclusione.

Installazione molto semplice

L’installazione è semplice, richiede solo ed esclusivamente l’installazione da Composer.

Creare una risorsa

CRUD sta per Create, Read, Update and Delete. Con una nomenclatura che ricorda molto quella di Nova, in Orchid CRUD è possibile creare una “Risorsa” tramite il comando Artisan

che va a creare uno stub della nuova classe nella cartella Orchid/Resources. Per questo esempio userò un’ipotetica risorsa MovieResource, supponendo di aver creato un model Movie.

Esattamente come visto anche in Nova, ogni risorsa deve avere un suo model collegato, che possiamo specificare nell’attributo statico $model.

Lo step successivo è andare ad aggiungere alcuni trait usati da Orchid al model. Come recita la documentazione, questi sono

Definire Field e Column

In Orchid, a differenza di Nova, la definizione dei campi con cui andremo a costruire il form per il CRUD e delle colonne che andranno a comporre “la lista” delle entità non avviene nello stesso metodo. In Orchid, infatti:

Se inizialmente la cosa mi aveva confuso, dopo un po’ ho apprezzato la possibilità di tenere le cose ben separate. Un altro punto in più per Orchid.

Ecco un esempio del contenuto che ho messo in fields:

Questo invece è il contenuto di columns:

Tramite TD::make possiamo definire nuove colonne per la nostra tabella. Il metodo aggiuntivo “render” ci permette di personalizzare il modo in cui mostrare il dato.

Una volta definiti campi e colonne, ecco come appare il nostro form di creazione/modifica:

Ed ecco come appare la lista dei film disponibili:

Più libertà, meno consuetudini

Il modulo CRUD, fino a questo momento, mi ha lasciato molto soddisfatto. Permette di fare un po’ tutto quello che già fa Nova.

Una domanda però sorge spontanea: come vengono gestite le relazioni? Ho così creato due nuove tabelle, di cui per comodità riporto il codice della relativa migration:

L’idea è semplice: vado direttamente sul “difficile” e cerco di capire come vengono gestite le relazioni many-to-many.

Come già detto prima, Orchid sacrifica un po’ di convenzioni per dare maggiore libertà. Di conseguenza, se vogliamo gestire un’associazione molti a molti, avremo bisogno di modificare la nostra risorsa, esplicitando il meccanismo di salvataggio e cancellazione.

Niente di traumatico comunque. modifichiamo i field della nostra risorsa MovieResource:

Quel “Relation” è di tipo Orchid\Screen\Fields\Relation e non è niente di relativo al modulo CRUD. In realtà, infatti, è un campo già disponibile in Orchid “base”.

Una volta modificati i campi, ecco come appare il nostro form:

Arrivati a questo punto non abbiamo più a che fare con il semplice CRUD dell’inizio. Dobbiamo implementare il codice per definire come comportarsi con quella relazione. Andiamo a lavorare su due metodi della classe base Orchid\Crud\Resource che vanno ridefiniti.

Questi due metodi sono onSave ed onDelete, che di default si comportano così:

Per qualsiasi entità “isolata” va benissimo, ma nel caso della nostra resource MovieResource, ovviamente, le cose cambiano. Nella MovieResource, quindi, aggiungiamo queste due definizioni:

A questo punto, il form funziona tranquillamente.

Qualche altra piccola chicca!

Riporto qui al volo, in modo molto stringato, le altre piccole cose che mi sono piaciute di questo modulo CRUD di Orchid:

Tiriamo le somme!

Insomma… ‘sto benedetto CRUD può essere usato come sostituto di Nova?

Secondo me, sì.

Come soluzione è ottima, a mio parere. Si fonda su pochi concetti di base molto solidi ma flessibili. Per quanto mi riguarda, posso fare a meno di alcune convenzioni “comode” se ho maggiore libertà di manovra.

Va detto anche che Orchid è totalmente gratuito. Non penso sia un aspetto fondamentale (99 euro di licenza per Nova sono assolutamente ben spesi, ricaricabili su qualsiasi progetto) (se 99 euro di licenza pesano, facciamoci qualche domanda su che progetti ci prendiamo sulle spalle).

Rispetto a Nova manca di alcune piccole cose, secondo me trascurabili o in via di implementazione. A questo punto, non nego che “la perfezione” secondo me sarebbe rendere Orchid compatibile con i field di Nova, in modo tale da aumentarne anche l’adozione. Chissà, magari potrei aprire qualche PR prossimamente…

Parliamoci chiaro: già così parliamo di un progetto BOMBA.

Qualcuno di voi l’ha provato? Fatemi sapere, sono curioso di conoscere le vostre esperienze.