(Have a) rest with Laravel

50

Transcript of (Have a) rest with Laravel

Page 1: (Have a) rest with Laravel
Page 2: (Have a) rest with Laravel

(Have a) RESTwith Laravel… o come costruire

REST APIs con Laravel

5.x

Francesco Malatesta - 22 Febbraio 2017

Page 3: (Have a) rest with Laravel

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’

];

Page 4: (Have a) rest with Laravel

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)

Page 5: (Have a) rest with Laravel

Parte I“Indietro nel Tempo”

Page 6: (Have a) rest with Laravel

Questo è

Francesco nel

2012(sta lavorando ad un CMS PHP con CodeIgniter, tutto sembra

andare bene, ma...)

Page 7: (Have a) rest with Laravel

PHP è Brutto.

strchr();

strstr(); strtok();

untaint();

mhash_keygen_s2k();

eregi();

uasort();

uksort(); arsort();

vsprintf();ereg();

posix_mkfifo();

lang_lock(); flag_rate();

Page 8: (Have a) rest with Laravel

… 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.

Page 9: (Have a) rest with Laravel

“Quindi… quello non era PHP…”

Page 10: (Have a) rest with Laravel

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!

Page 11: (Have a) rest with Laravel

C’è bisogno di…

● Potenza.● Espressività.

Nel frattempo, da qualche altra parte...

Page 12: (Have a) rest with Laravel

SymfonyDicembre 2011 - Symfony 2.0.7 su Packagist

Page 13: (Have a) rest with Laravel

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.

Page 14: (Have a) rest with Laravel

Laravel!2012 - Laravel 3

2013 - Laravel 4 (su Packagist)

Page 15: (Have a) rest with Laravel

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à.

Page 16: (Have a) rest with Laravel

Espressività

Storage::disk('s3')->put('avatars/1', Storage::disk('local')->get('avatar.png'));

Page 17: (Have a) rest with Laravel

Espressività #2

if (Auth::attempt(['email' => $email, 'password' => $password])) {

return redirect()->intended('dashboard');

}

Page 18: (Have a) rest with Laravel

Espressività #3

$value = Cache::remember('user', $minutes, function () {

return DB::table('users')->find(1);

});

Page 19: (Have a) rest with Laravel
Page 20: (Have a) rest with Laravel

Parte 2“Laravel… nel 2017”

Page 21: (Have a) rest with Laravel

19.320.041~33k Installazioni / giorno

Page 22: (Have a) rest with Laravel

Un Solido Processo di Release

Ogni 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;

Page 23: (Have a) rest with Laravel

Laravel sta Crescendo

Laravel 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);

Page 24: (Have a) rest with Laravel

“Ok, ma… alla fine, chi lo usa, questo Laravel?”

Page 25: (Have a) rest with Laravel

Startup

perché è molto comodo per creare al volo un MVP, in modo da poter validare

velocemente un’idea di business;

PMI

perché può offrire il giusto compromesso tra potenza ed facilità d’uso, adatto

a creare applicazioni;

Enterprise

può essere tranquillamente usato in applicazioni molto più grandi, affiancato

da tool e/o microservizi in base al dominio;

… un po’ tutti!

Page 26: (Have a) rest with Laravel

Caso 1 - Startup - Netlex

Software gestionale per studi legali;

Sviluppato e venduto come Software as a Service;

Recentemente, exit con TeamSystem;

Nessun problema in termini di performance;

Page 27: (Have a) rest with Laravel

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;

Page 28: (Have a) rest with Laravel

Caso 3 - Enterprise - Ericsson

Sistema di Gestione Documentale;

Affiancato a:

Elasticsearch;

Microservizi;

Nessun problema in termini di performance;

Page 29: (Have a) rest with Laravel

Parte 3“Debunking Time!”

Page 30: (Have a) rest with Laravel

Bugia N.1

“Le Facade di Laravel usano metodi statici, non è codice pulito!”

Page 31: (Have a) rest with Laravel

… 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

Page 32: (Have a) rest with Laravel

Bugia N.2

“Laravel favorisce un ecosistema chiuso.”

Page 33: (Have a) rest with Laravel

… 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;

Page 34: (Have a) rest with Laravel

Bugia N.3

“Laravel è scritto con componenti Symfony, conviene usare Symfony!”

Page 35: (Have a) rest with Laravel

… 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;

Page 36: (Have a) rest with Laravel

Bugia N.4

“Non conviene usare un framework come Laravel, crei un monolite su cui domani dovrai

rimettere le mani.”

Page 37: (Have a) rest with Laravel

… 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;

Page 38: (Have a) rest with Laravel

Bugia N.5

“Laravel non incoraggia le buone pratiche nello sviluppo software.”

Page 39: (Have a) rest with Laravel

… non è vero.

“Non esistono pessimi linguaggi di

programmazione. Solo pessimi sviluppatori.”

Page 40: (Have a) rest with Laravel

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.

Page 41: (Have a) rest with Laravel

Parte 4“Have a REST”

Page 42: (Have a) rest with Laravel

Cosa significa costruire API REST?

Sta per REpresentational State Transfer;

Prevede un’interfaccia uniforme

set di operazioni ben definite;

set di risposte ben definite;

Prevedere l’assenza di uno stato;

Page 43: (Have a) rest with Laravel

Yes, but...

Page 44: (Have a) rest with Laravel

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?

Page 45: (Have a) rest with 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;

Page 46: (Have a) rest with Laravel

I Package

DingoAPI (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)

Page 47: (Have a) rest with Laravel

… 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);

Page 48: (Have a) rest with Laravel
Page 49: (Have a) rest with Laravel

Domande?

Page 50: (Have a) rest with Laravel

… grazie :)