(Have a) REST with Laravel
-
Upload
francesco-malatesta -
Category
Software
-
view
45 -
download
0
Transcript of (Have a) REST with Laravel
(Have a) RESTwith
Laravel… o come costruire REST APIs con
Laravel 5.x
Francesco Malatesta - 22 Febbraio 2017
Chi Sono?Francesco Malatesta
Developer @ AdEspresso (adesso parte della famiglia Hootsuite)
Founder @ Laravel-Italia
Author @ Sitepoint
Author/Translator @ Packt Publishing / Leanpub$profiles = [ ‘github’ => ‘francescomalatesta’, ‘twitter’ => ‘@malatestafra’, ‘facebook’ => ‘malatesta.francesco’];
Cos’è Laravel?Framework PHP
il più semplice da usare in circolazione;
tanto materiale per l’apprendimento:
ottima documentazione, Laracasts;
libri: (O’Reilly “Laravel Up and Running”, traduzioni in tutte le lingue);
crescita pazzesca negli ultimi 5 anni:
19.320.041 installazioni (~33k al giorno) (fonte: packagist);
54860 domande su Stackoverflow (~100 al giorno)
ecosistema attivissimo:
Forge (provision server), Envoyer (deploy e monitoring), Spark (boilerplate);
forum (laravel.io), jobs (larajobs), consultancy (laravelgurus), conference (laracon);
Community Ita: ~1000 like Facebook, ~750 iscritti al forum, ~350 utenti Slack;
Parte I“Indietro nel Tempo”
Questo è Francesco nel 2012
(sta lavorando ad un CMS PHP con CodeIgniter, tutto
sembra andare bene, ma...)
PHP è Brutto.
strchr();strstr(); strtok()
;
untaint();
mhash_keygen_s2k();
eregi();
uasort();
uksort();
arsort();
vsprintf();
ereg();
posix_mkfifo();
lang_lock();
flag_rate();
… ok, queste due non sono PHP. Quasi.lang_lock();
http://harrypotter.wikia.com/wiki/Langlock
flag_rate();http://harrypotter.wikia.com/wiki/Flagrate
Gif: Flagrate in azione.
“Quindi… quello non era PHP…”
I Framework sono ancora deboli, e brutti...
$this->load->library('ftp');
$config['hostname'] = 'ftp.example.com';$config['username'] = 'your-username';$config['password'] = 'your-password';$config['debug'] = TRUE;
$this->ftp->connect($config);
… ed anche questa slide non scherza!
C’è bisogno di…
● Potenza.● Espressività.
Nel frattempo, da qualche altra parte...
SymfonyDicembre 2011 - Symfony 2.0.7 su Packagist
Cosa porta Symfony nel mondo PHP?Buone pratiche in un linguaggio che
prima quasi non ne conosceva;
Il concetto di Service Container;
Permette agli sviluppatori di crescere meglio, visto che hanno a che fare con uno strumento più sofisticato;
Potenza.
Laravel!2012 - Laravel 3
2013 - Laravel 4 (su Packagist)
Cosa porta Laravel nel mondo PHP?Semplifica usando come base alcuni
componenti di Symfony;
Rende lo sviluppo di applicazioni (anche complesse) alla portata di tutti;
Sistema di componenti driver based, utili per scalare;
Semplifica la sintassi, introducendo (ma senza sacrificare la potenza)...
Espressività.
Espressività
Storage::disk('s3')->put('avatars/1', Storage::disk('local')->get('avatar.png'));
Espressività #2
if (Auth::attempt(['email' => $email, 'password' => $password]))
{
return redirect()->intended('dashboard');
}
Espressività #3
$value = Cache::remember('user', $minutes, function
() {
return DB::table('users')->find(1);
});
Parte 2“Laravel… nel 2017”
19.320.041~33k Installazioni / giorno
Un Solido Processo di ReleaseOgni due anni viene rilasciata una nuova LTS;
La LTS attuale è la 5.1;
La prossima LTS sarà la 5.5, prevista per Luglio/Agosto 2017;
Ogni LTS conta 2 anni di bug fix, 3 anni di security update;
Ogni versione intermedia conta 6 mesi di bug fix, 1 anno di security update;
Il processo di upgrade è migliorato rispetto al passato;
Laravel sta CrescendoLaravel 4.X dipendeva da più componenti di Symfony;
In Laravel 5.X, molti di questi componenti sono stati riscritti da zero, per migliorare le performance dove possibile;
Occhio attento al frontend (supporto per Webpack in 5.4);
Nuovi componenti aggiunti nelle ultime versioni:
Cashier (gestione di pagamenti);
Passport (creazione di un server OAuth 2.0);
Scout (implementazione di ricerca full-text per Eloquent);
Envoy (automazione esecuzione di comandi su server);
Dusk (utility per browser automation testing);
“Ok, ma… alla fine, chi lo usa, questo Laravel?”
Startupperché è molto comodo per creare al volo un MVP, in modo da
poter validare velocemente un’idea di business;
PMIperché può offrire il giusto compromesso tra potenza ed
facilità d’uso, adatto a creare applicazioni;
Enterprisepuò essere tranquillamente usato in applicazioni molto più
grandi, affiancato da tool e/o microservizi in base al dominio;
… un po’ tutti!
Caso 1 - Startup - NetlexSoftware gestionale per studi legali;Sviluppato e venduto come Software as a Service;Recentemente, exit con TeamSystem;Nessun problema in termini di performance;
Caso 2 - PMI - Fater S.p.A.Software per la gestione dei siti aziendali;
Pampers;
Tampax;
Lines;
ACE;
Più di un milione di iscritti;
Nessun problema in termini di performance;
Caso 3 - Enterprise - EricssonSistema di Gestione Documentale;
Affiancato a:Elasticsearch;
Microservizi;
Nessun problema in termini di performance;
Parte 3“Debunking Time!”
Bugia N.1
“Le Facade di Laravel usano metodi statici, non è codice pulito!”
… non è vero.non è un vero metodo statico, ma __callStatic();
viene usata un’istanza corrispondente, presente nel Service Container;
non è obbligatorio usare le Facade: per ognuna esiste la controparte “istanziabile” ed usabile in modo ancora più pulito
Cache => Illuminate\Cache\Repository
File => Illuminate\Filesystem\Filesystem
Log => Illuminate\Log\Writer
Mail => Illuminate\Mail\Mailer
Schema => Iluminate\Database\Schema\Blueprint
Bugia N.2“Laravel favorisce un ecosistema chiuso.”
… non è vero.Forge permette:
Provision di server su vari provider (DigitalOcean, AWS, Custom);
Deploy di applicazioni di diverso tipo (Laravel, Lumen, Symfony, Static HTML);
Envoyer permette:Deploy automatici di svariati tipi di applicazione (Laravel, Altro);
Dopo il deploy, health check ed altre feature sono uguali per tutti;
Bugia N.3
“Laravel è scritto con componenti Symfony, conviene usare Symfony!”
… non è vero.Laravel dipendeva molto dai Symfony Component nella versione 4.X;
Dalla versione 5.0 in poi molti componenti sono stati riscritti da zero, per migliorare le performance dove necessario;
Symfony Components != Symfony Framework
Symfony Framework, come Laravel, è costruito sui Symfony Component;
Symfony Framework e Laravel presentano svariate differenze;
Conoscendone uno, è più semplice lavorare l’altro;
Bugia N.4“Non conviene usare un framework come
Laravel, crei un monolite su cui domani dovrai
rimettere le mani.”
… non è vero.In caso di applicazioni in fase di partenza:
raramente si ha la possibilità (ed i mezzi) per creare da subito un sistema ad-hoc;
se il monolite non è scritto male, si possono scorporare alcune parti critiche in microservizi in un secondo momento senza problemi;
In caso di applicazioni più grandi:Parti critiche delegate a microservice ad-hoc;
Laravel continua a gestire altri aspetti, su cui è più semplice lavorare;
Fare over-engineering durante il bootstrap di un progetto non è una garanzia di risultato sicuro;
Bugia N.5“Laravel non incoraggia le buone pratiche
nello sviluppo software.”
… non è vero.
“Non esistono pessimi linguaggi di programmazione. Solo pessimi
sviluppatori.”
LCB = Luoghi Comuni Buoni
Il proiettile d’argento non esiste.
Un framework è uno strumento, ha pro e contro, risolve alcune problematiche e
ne presenta altre. Accettalo.
Tutto dipende dalle necessità di business.
Parte 4“Have a REST”
Cosa significa costruire API REST?Sta per REpresentational State Transfer;
Prevede un’interfaccia uniformeset di operazioni ben definite;
set di risposte ben definite;
Prevedere l’assenza di uno stato;
Yes, but...
Costruire REST API significa...Fare in modo che l’applicazione che noi scriviamo
Gestisca correttamente le richieste in entrata;
Gestisca correttamente le risposte in uscita;
Aderisca a determinati standard e convenzioni;
Non sappiamo che applicazione ci si dovrà interfacciare;
Possiamo farlo con Laravel?
Si, perché:Laravel è un framework per lo sviluppo di web app;Ci sono svariati package che facilitano il compito;Dopotutto, non sarei qui se non fosse possibile;
I PackageDingoAPI (https://github.com/dingo/api)
aiuta ad implementare la content negotiation;
agevola il versioning delle API;
permette implementare il rate limit (e tanto altro);
JWT-Auth (https://github.com/tymondesigns/jwt-auth)
implementa un sistema di auth stateless, basato su token;
già pronto ad essere usato con DingoAPI
Laravel-CORS (https://github.com/barryvdh/laravel-cors)
gestisce tutto quello che riguarda le richieste provenienti al di fuori del dominio;
non integrato con DingoAPI, ma facile da agganciare;
… per i più pigri:
github.com/francescomalatesta/laravel-api-boilerplate-jwt
boilerplate già pronto ad essere usato;
permette di generare al volo tutta l’infrastruttura;
sistema di auth (con relativi controller) già pronto;
aggiornato a Laravel 5.3 (a giorni 5.4);
Domande?
… grazie :)