Qualche giorno fa mi sono ritrovato a scoprire un progetto piuttosto singolare: Laracogs. Ero alla ricerca, come al solito, di qualche tool/package interessante da riportare qui su Laravel-Italia, e ne sono rimasto colpito.
Fondamentalmente, Laracogs è un package che fornisce una quantità non indifferente di generatori di codice per la propria applicazione. L’obiettivo che si prefissa (e che nella seconda parte dell’articolo vedremo raggiungere) è di rendere immediato il bootstrap di una nuova applicazione.
C’è da dire che un buon programmatore ovviamente lo sa: non ci si può basare su un generatore per qualsiasi soluzione. Tuttavia, ci sono casi in cui si ha la necessità di avviare velocemente un progetto, e potersi basare su alcuni “mattoni di base” per la costruzione di un prototipo può essere enormemente utile.
Oggi, in questo articolo, guarderemo un po’ Laracogs nel dettaglio. Vedremo innanzitutto quali sono le sue features, per poi passare ad installarlo in un nuovo progetto e fare qualche “prova su strada”.
Iniziamo!
Le Feature di Laracogs
Possiamo dividere, innanzitutto, le feature più interessanti di Laracogs in
- Kit: veri e propri boilerplate per la creazione di funzionalità abbastanza ampie. Non si fermano ad una singola classe ma creano una base per l’infrastruttura dell’applicazione da costruire;
- Utility: generatori più “piccoli”, pensati per aggiungere ai kit utilizzati delle ulteriori funzionalità;
I Kit
Iniziamo a dare uno sguardo ai vari kit che ci vengono messi a disposizione.
Starter
Sicuramente il kit più importante. Come il nome suggerisce, Starter genera tutto quello che può servire ad un’applicazione per fare in modo di implementare tutte le funzionalità di base più comuni.
Dashboard, accesso utente, recupero delle credenziali, pagina delle impostazioni utente, e non solo.
Vale la pena sicuramente provarlo per primo, nonostante richieda cinque minuti in più per configurare tutto adeguatamente. Nella seconda parte di questo articolo vedremo come, ad ogni modo!
API
Quante volte ci è capitato di dover generare un layer API per un’applicazione? Grazie a questo kit, sarà possibile generare tutto il codice necessario.
Il generatore in questo caso fa uso dell’ottimo tymon/jwt-auth per gestire la parte relativa all’autenticazione con JSON Web Token.
Billing
Un’altra feature abbastanza ricorrente, in un’applicazione, la possibilità di far pagare i nostri utenti la propria iscrizione, seguendo piani ben definiti.
Predisponendo tutto il necessario, il kit Billing si occuperà di generare tutto il necessario per permettere, al nostro utente, di pagarci per l’uso della nostra applicazione.
Grazie anche a Laravel Cashier, specificare piani e costi sarà semplicissimo… come digitare un comando artisan!
Bootstrap / Semantic
Bootstrap e Semantic UI sono due framework molto famosi per la costruzione di interfacce. Tramite questi due kit, sarà possibile implementare uno dei due, a scelta, nella propria applicazione.
Davvero molto comodo!
Docs
Creata l’applicazione, come fare per il manuale d’istruzioni? Anche in questo caso, c’è un kit appositamente concepito per lo scopo.
Si chiama Docs, e si occupa di creare un microsito con la documentazione della nostra applicazione, pronta ad essere consultata.
Volendo, inoltre, può creare velocemente un file di configurazione per Sami.
Notifications
C’è poco da fare: le notifiche sono un ottimo modo che abbiamo per consentire ai nostri utenti di rimanere informati su quello che succede nella nostra applicazione.
I ragazzi di Laracogs lo sanno, ed hanno deciso di inserire un kit appositamente concepito per lo scopo.
Una volta terminata la generazione, tutto quello che lo sviluppatore dovrà fare sarà inserire una semplice voce nel menu di navigazione dell’applicazione.
Socialite
Se abbiamo scelto di usare il kit Starter per generare la base portante della nostra applicazione, potremmo anche aver deciso di permettere ai nostri utenti di accedere tramite un account social.
Il kit Socialite è quello che fa per noi: agganciandosi a tutto quello che è stato già generato con Starter, aggiungerà in un attimo questa funzionalità.
Le Utility
Laracogs non è solo un insieme di Kit. Ci sono anche le utility, alcune delle quali decisamente interessanti.
CRUD
Sappiamo perfettamente cosa serve, all’inizio, ad ogni applicazione di base: creazione, cancellazione, modifica ed elenchi di record. Stop. L’utility CRUD serve esattamente a questo: generare velocemente tutto il necessario per creare delle schermate che permettano queste operazioni su questa o quella entità.
Non soltanto schermate, tra l’altro: Laracogs si occuperà anche di creare le dovute migration, controller e route correlate.
Niente male, vero?
Crypto
Crypto mette a disposizione dello sviluppatore una serie di tool e metodi per generare velocemente UUID e crittare (anche decrittare) contenuti vari ed eventuali.
Il tutto tramite metodi semplici da usare e con risultati url friendly.
Form/Input Maker
Stiamo parlando di due utility diverse, Form Maker ed Input Maker. Il loro obiettivo, tuttavia, è comune: dare la possibilità ad un utente di creare ancora più velocemente form ed input per interagire con i propri utenti.
Molto interessante la possibilità di collegare il form da generare ad una tabella sul database, automatizzandone ulteriormente la costruzione.
Table CRUD
Last but not least, questa utilità costruirà tutto quello che viene già costruito con CRUD, con la differenza che in questo caso la struttura verrà automaticamente “dedotta” da una tabella già esistente nel sistema.
Da provare, se si sta creando un’applicazione su un vecchio database.
Installiamolo!
Laracogs è semplicissimo da installare. Vediamo come creare una nuova applicazione Laravel (usando come ambiente Homestead Improved).
Installiamo innanzitutto Homestead Improved:
// Cloniamo il repository…
git clone http://github.com/Swader/homestead_improved
// Creiamo il progetto Laravel con Composer…
composer create-project laravel/laravel Project
Prima di avviare la macchina virtuale, specifichiamo un hostname in Homestead.yaml
e salviamo il record corrispondente nel file hosts
della nostra macchina locale. Nel mio caso ho associato l’ip della macchina virtuale con l’hostname `laracogs.app’.
// Avviamo la macchina ed entriamo con ssh…
vagrant up
vagrant ssh
A questo punto…
// Andiamo nella cartella del progetto…
cd Code/Project
// Installiamo Laracogs…
composer require yab/laracogs
Siamo quasi arrivati alla fine del processo di installazione. Non rimane altro che aggiungere il service provider
YabLaracogsLaracogsProvider::class
in config/app.php
ed eseguire
artisan vendor:publish –provider=”YabLaracogsLaracogsProvider”
per pubblicare i vari asset.
Fatto!
Importante: non scordiamoci di eseguire npm install
per avere a disposizione Laravel Elixir, necessario per usare tutte le feature di Laracogs.
Proviamolo!
Per fare un test delle potenzialità di Laracogs, creeremo un’applicazione di prova usando il suo Starter Kit.
Creeremo un catalogo di film, dei quali memorizzeremo alcune informazioni di base: titolo, durata, anno di uscita ed il genere di appartenenza.
Avremo quindi due possibili utenti: gli amministratori, che potranno aggiungere, modificare e cancellare i film del catalogo, mentre qualsiasi altro utente (anche non autenticato) potrà tranquillamente consultare il catalogo.
1. Configurazione dello Starter
Innanzitutto, configuriamo tutto il necessario ed avviamo il comando che genera i file dello starter kit.
Iniziamo dal file app/Http/Kernel.php
. Aggiungiamo all’array $routeMiddleware
un nuovo elemento:
‘admin’ => AppHttpMiddlewareAdmin::class,
‘roles’ => AppHttpMiddlewareRoles::class,
per poi passare a config/auth.php
, dove dobbiamo sostituire il model standard dell’utente con quello “nuovo” di Laracogs.
AppRepositoriesUserUser::class
Nota: se stiamo usando un IDE potremmo ricevere dei messaggi riguardanti classi non esistenti (come il middleware Admin
, oppure il model User
di Laracogs). Non preoccupiamocene, perché è normale: queste due classi rientrano infatti tra quelle che verranno generate a breve.
Chiamiamo ora define
sul $gate
come segue, in app/Providers/AuthServiceProvider.php
$gate->define(‘admin’, function ($user) {
return ($user->roles->first()->name === ‘admin’);
});
$gate->define(‘team-member’, function ($user, $team) {
return ($user->teams->find($team->id));
});
Volendo, possiamo anche creare al volo una configurazione per il database di test, aggiungendo questo elemento in config/database.php
:
‘testing’ => [
‘driver’ => ‘sqlite’,
‘database’ => ‘:memory:’,
‘prefix’ => ”,
],
Sempre nel contesto dei test, aggiungiamo queste due variabili al file phpunit.xml
:
Probabilmente stiamo usando Laravel 5.2. Ragion per cui dobbiamo modificare, in config/auth.php
, le impostazioni riguardanti il recupero delle password.
‘passwords’ => [
‘users’ => [
‘provider’ => ‘users’,
‘email’ => ‘emails.password’,
‘table’ => ‘password_resets’,
‘expire’ => 60,
],
],
Un’ottima idea, inoltre, è di impostare il MAIL_DRIVER
nel file .env
con il valore log
, in modo tale da poter provare subito la procedura di registrazione di un nuovo utente.
MAIL_DRIVER=log
2. Eseguiamo lo Starter
A questo punto possiamo avviare il comando
artisan laracogs:starter
e scegliamo “yes” alla domanda riguardante la sovrascrittura eventuale di file. Attendiamo qualche secondo e, terminata l’esecuzione del comando, digitiamo
composer dumpautoload
artisan migrate –seed
per aggiornare il file di autoload e costruire il database correttamente.
A questo punto, installiamo bootstrap in modo tale che le nostre view siano più gradevoli alla vista.
Come? Semplicemente, con un
artisan laracogs:bootstrap
ed un
gulp
per compilare tutti gli asset.
Sistemata anche quest’ultima parte, occorre testare se tutto funziona. Andiamo all’indirizzo laracogs.app/login (l’hostname cambia in base a quello scelto nel file hosts
, ovviamente) e…
Fatto!
Da notare che l’applicazione, per quanto riguarda la gestione di utenti, funziona già! Possiamo effettuare l’accesso, infatti, usando come credenziali admin@admin.com e admin come password.
3. CRUD dei Film
Il primo step sarà configurare il CRUD per i film. Ad aiutarci nell’impresa c’è il tool CRUD, appunto. Come? Così:
artisan laracogs:crud movie –migration –bootstrap –schema=”id:increments,name:string,year:integer,length:integer,genre:string”
Esatto: un singolo e semplice comando. Vediamo come funziona:
- il comando è
laracogs:crud
; movie
è il nome dell’entità che andremo a gestire. A partire da questa parola verrà creato tutto il resto (controller, route, model e così via);--migration
indica che dovrà essere creata anche una migration per l’entità in questione;--boostrap
indica che verrà usato Bootstrap come framework per l’interfaccia utente da costruire;--schema
permette di specificare da linea di comando quale sarà la struttura della tabella dei film;
Fatto! Ora, eseguiamo in sequenza
artisan migrate
Per aggiornare lo schema del database.
Adesso, proviamo ad accedere a laracogs.app/movies.
Funziona! Cliccando su “Add New” possiamo aggiungere film alla tabella. Niente male, per non aver scritto una sola riga di codice finora, vero?
4. Permessi
Non rimane altro che gestire la questione dei permessi: in questo caso, possiamo tranquillamente indicare al controller MovieController
di usare il middleware roles
che abbiamo visto in precedenza… come segue:
…
class MovieController extends Controller
{
public function __construct(MovieService $movieService)
{
$this->service = $movieService;
$this->middleware(‘roles:admin’, [‘except’ => [‘index’, ‘show’]]);
}
…
Et voilà! Adesso qualsiasi utente non autorizzato si ritroverà una schermata “Unauthorized Access Denied” nel caso in cui volesse provare a modificare o aggiungere nuovi film alla collezione.
Conclusioni
Bene, siamo arrivati in fondo. Vediamo di tirare un po’ le somme su Laracogs.
Di base è sicuramente un bel progetto interessante e degno di nota. Al momento in cui scrivo è abbastanza attivo, la prima commit risale a Gennaio e l’ultima a circa otto ore fa.
Inutile dire, tuttavia, che c’è ancora molto da fare. Sarebbe bello, infatti, vedere qualcosa di più.
Per non rimanere sul generico faccio qualche esempio:
- migliore gestione (e magari automatizzazione, un minimo?) delle relazioni tra model;
- migliore gestione di ruoli e permessi (un controllo più granulare non dispiacerebbe);
Le idee ovviamente sono tante, così come le possibilità. Personalmente, continuerò a tenere sotto controllo questo esperimento, ed aggiornerò l’articolo in caso di news!