(Have a) rest with Laravel

Post on 12-Apr-2017

78 views 0 download

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)

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

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

“Ok, ma… alla fine, chi lo usa, questo 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!

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;

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 - Ericsson

Sistema 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

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 uniforme

set 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 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)

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