Laravel Cafè #5 - Laravel Vs. Lumen

Una domanda che appare spesso su Slack ed in generale sulle varie community: quando usare Lumen, e quando Laravel? Proviamo a capirne di più.
francesco
Filippo Galante
30/11/2016 in Tutorial


Benvenuto al Laravel Cafè! Ogni settimana proporremo un nuovo argomento sul mondo Laravel, quindi trova un posto libero, prendi un caffè e condividi le tue opinioni con la comunità! L'idea è di creare un punto di discussione. Se hai qualche perplessità sull'argomento trattato, leggi fino alla fine e fai una domanda usando il forum! Cercheremo di risponderci a vicenda e di aiutarci, ed il confronto ci farà crescere tutti un po' di più.

Di mercoledì in mercoledì parleremo di qualcosa di diverso, quindi tornaci a trovare! Potresti dare una mano a qualcuno in difficoltà, o ricevere tu un aiuto in caso di problemi! Dai, siediti, il primo caffè lo offriamo noi.

L'Argomento

Nei giorni scorsi tra i moltissimi argomenti interessanti che ogni giorno affrontiamo sul canale Slack di Laravel Italia è emersa una domanda:

Quali sono le differenze sostanziali tra Laravel e Lumen?

Una domanda che in molti si pongono ma alla quale non è sempre semplice dare risposta. Cercando in maniera molto semplice "Laravel vs Lumen" su google ci si trova di fronte a una miriade di risultati, molti dei quali parziali o molto generici. Questo articolo ad ogni modo non è una comparazione tra i due framework, ma delinea semplicemente gli aspetti tecnologici alla base, cercando di dare una visione generale sulle possibili applicazioni di entambi.

Inizio con un piccola nota su entrambi i framework riguardante la documentazione. Dato che l'obbiettivo di oggi è capire un po' meglio quali sono le differenze alla base tra i due framework, la cosa migliore da fare solitamente è consultare la documentazione ufficiale ma, come già sottolineato in altri articoli, questa risulta un po' scarna soprattutto se si vuole capire cosa c'è nel dietro le quinte di tutti i workflow, le injection e le interazioni tra le varie componenti. Se però aggiungiamo Laracasts, un codice sorgente ben commentato, una comunità molto attiva a livello internazionale e cercando approfonditamente nel web potremmo soddisfare la nostra sete di conoscenza e delineare meglio le differenze tra i due framework.

Cercando di minimizzare il tutto in una frase: entrambi i framework hanno come obbiettivo l'elaborazione di una request e la restituzione di un response e tutte le differenze tra i due framework risiedono nell'elaborazione della request.

Dalla documentazione inoltre spicca una caratteristica importante: la maggior parte delle componenti alla base sono le stesse e questo permette di utilizzare il codice sviluppato per Laravel su Lumen e viceversa, semplicemente copiando i vari controller, modelli ecc. La domanda ora è "funzionerà tutto sempre e comunque?", fondamentalmente si ma vanno tenuti in considerazione alcuni accorgimenti, principalmente legati allo "scopo" di una applicazione scritta in Laravel o in Lumen e alla fine dell'articolo vedremo quali.

Come si legge nella homepage e in questa risposta di StackOverflow Lumen is all about speed. La velocità nell'elaborazione della richiesta è la caratteristica peculiare di Lumen, il quale può gestire molte più richieste di Laravel e che, con il passare del tempo, si è focalizzato verso obiettivi più specifici, sacrificando una parte di versatilità, ma rendendolo estremamente adatto alla creazione di microservice.

Cerchiamo di chiarirci un po' meglio le idee in primis spulciando il dettaglio del lifecycle di una request in Laravel e potremmo farci un quadro generale più completo su tutto ciò che il framework gestisce prima di chiamare una qualunque rotta o un qualunque controller. Allo stesso modo, se facciamo caso alla composizione di uno stacktrace generato successivamente al rendering di una exception, si può intuire la complessità delle operazioni eseguite.

Tutta questa complessità ad ogni modo ha reso il framework flessibile, versatile, facilmente configurabile e con moltissime altre feature e componenti pronte all'uso. Lumen invece sacrifica la flessibilità e la versatilità per guadagnarne in velocità. Come anticipato alcune componenti sono differenti, come nel caso del sistema di routing, o omessi, come nel caso delle Facade, tutto per poter elaborare il maggior numero di richieste possibili nel minor tempo possibile. La sostanziale differenza la si nota comunque nella fase di boot, studiata appositamente per migliorare le prestazioni.

Di questa intervista in cui Taylor Otwell annunciava l'uscita di Lumen, vorrei riportare l'ultima domanda che gli è stata posta per iniziare a tirare le somme:

How were you able to get the framework so fast, while still keeping so many great features? This is again due to the great convenience of the Illuminate components. Basically, all I needed to do was “glue” them together in a different way than a full-stack framework would glue them together. This means instead of maximum flexibility in the bootstrapping process, Lumen opts for maximum speed. The actual Lumen framework repository is probably only a dozen files or so. The rest is made up of the Illuminate components. This allowed me to flesh out the features of the framework very quickly, though it did take me three or four iterations to find a solution that was really, really fast while still providing very powerful features.

Traduzione

Com'è stato possibile rendere così veloce il framework e mantenere al tempo stesso così tante ottime features? Ciò è ancora riconducibile alla grande comodità dei componenti Illuminate. Fondamentalmete, tutto ciò di cui avevo bisogno era "incollarle" insieme in maniera diversa da come un full-stack framework avrebbe fatto. Questo significa che Lumen opta per una velocità massima al posto di una flessibilità massima nel processo di bootstrap. L'attuale repository del framework Lumen è probabilmente composta da una dozzina di file poco più. Il resto è formato dalle componenti Illuminate. Questo mi ha permesso di arricchire le feature del framework molto velocemenete, anche se mi ci sono volute tre o quattro iterazioni per trovare una soluzione che fosse veramente, veramente veloce e mantenere comunque delle feature molto potenti.

Siamo ormai alla fine della pausa e vorrei arrivare al "punto" della situazione. Quando utilizzare Lumen? Quando, invece, non usarlo?

Se stiamo partendo con un nuovo progetto, l'overengineering non è che un male. Partire con Laravel è quindi la soluzione più opportuna. Basta pensare anche ad una semplice autenticazione e relativa gestione utenti, che con Lumen è un attimo più macchinosa. Laravel è la scelta precisa, sia per le feature che il framework mette a disposizione che per la grande disponibilità di package aggiuntivi.

A partire dalla versione 5.2, Lumen si sta sempre più focalizzando sulla creazione di microservice il cui scopo è facilitarci la vita gestendo operazioni come la gestione di code, piuttosto che creare dei cronjob di estrapolazione di dati statistici e inviare i relativi risultati attraverso una mail di riepilogo. Ecco, questo è il caso d'uso ideale: una gestione di task semplificata all'osso che carica lo stretto indispensabile e restituisce una risposta rapida e precisa.

Insomma, il nostro progetto sta diventando sempre più grande? Utilizzare una soluzione ibrida può essere molto efficace, spacchettando il monolite in tanti microservice specifici e indipendenti, magari avendo comunque alla base Laravel per la gestione di altre parti, del filesystem e così via... Come al solito le applicazioni possono essere infinite!

... ed ora?

E Voi?

Utilizzate Lumen? Se si per cosa? Quali sono le caratteristiche che più vi piacciono di questi due framework?

Questo articolo è stato solo un breve specchietto sulle principali differenze e come al solito vi invito a continuare la discussione continuando la discussione di questo articolo o raggiungendoci sul nostro Slack!