Applicazioni alla Velocità della Luce, con Laracogs!

Laracogs è un progetto relativamente nuovo che si pone un obiettivo ben preciso: velocizzare ancora di più lo sviluppo di applicazioni con Laravel! Vediamo come...
francesco
Francesco Malatesta
30/05/2016 in Package

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!

Pagina della Documentazione

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.

Pagina della Documentazione

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!

Pagina della Documentazione

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.

Pagina della Documentazione

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.

Pagina della Documentazione

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?

Pagina della Documentazione

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.

Pagina della Documentazione

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.

Pagina della Documentazione

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

Yab\Laracogs\LaracogsProvider::class

in config/app.php

ed eseguire

artisan vendor:publish --provider="Yab\Laracogs\LaracogsProvider"

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' => \App\Http\Middleware\Admin::class,
'roles' => \App\Http\Middleware\Roles::class,

per poi passare a config/auth.php, dove dobbiamo sostituire il model standard dell'utente con quello "nuovo" di Laracogs.

App\Repositories\User\User::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:

<env name="DB_CONNECTION" value="testing"/>
<env name="MAIL_DRIVER" value="log"/>

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!