Una introduzione a Laravel, un framework open source di tipo MVC scritto in PHP per lo sviluppo di applicazioni web. La versione di riferimento per questa presentazione è la 5.x
1. Laravel from scratch
“Laravel è un framework open source
di tipo MVC scritto in PHP
per lo sviluppo di applicazioni web,
creato come derivazione di Symfony.”
- Dalla pagina wikipedia di Laravel
2. 2
Overview
● Requisiti di Laravel
● DotEnv, Artisan CLI & Blade
● Directory di un progetto
Laravel
● Service container
● Service provider
● Facade & Contract
● Routing
● Middleware
Laravel Mario Traetta
● CSRF Protection
● Controller
● Request & Response
● View
● Session
● Database
● Eloquent ORM
● Laradock
4. 4
DotEnv
● “.env”
● Configurazioni comuni per progetto
● Riadattabilità
● Macchine di sviluppo
● Macchine di produzione
● Sviluppo con container
● Sviluppo con macchine virtuali
Laravel Mario Traetta
5. 5
Artisan CLI
● Basata sulla Symfony Console
● Interfaccia a linea di comando
● Comandi eseguibili dal codice sorgente
● Mette a disposizione comandi per
• Visualizzare aiuti per lo sviluppatore
• Generare componenti di progetto
• Amministrare e gestire il progetto
Laravel Mario Traetta
6. 6
Blade
● Template engine ufficiale
● “.blade.php”
● Localizzazione
● Layout
● Riuso
● Estensione
Laravel Mario Traetta
7. 7
Blade: strutture di controllo
● Direttive
● If
● Switch
● Loop
● Commenti
● Embedded PHP
● Token CSRF
Laravel Mario Traetta
8. 8
Directory di un progetto Laravel (1/2)
● App: Classi principali
● Bootstrap: File d’avvio e directory di cache
● Config: Configurazioni per servizi
● Database:
● Migrazioni database
● Factory dei modelli di tabella
● Seeds
● Public: Entry point all’applicazione e del suo
l’autoloading
Laravel Mario Traetta
9. 9
Directory di un progetto Laravel (2/2)
● Resources: View e assets
● Routes: File di routing
● Storage:
● Template Blade
● Cache di file
● Altri file generabili
● Tests: File per automazione di test PHPUnit
● Vendor: Dipendenze gestite da Composter
Laravel Mario Traetta
10. 10
Nota sulla directory Storage
La sottodirectory “storage/app/public”
● File generati dagli utenti
● Accesso pubblico tramite “public/storage”
● Uso di symlink
● Comando Artisan
Laravel Mario Traetta
11. 11
Service Container
● Gestore delle dipendenze delle classi
● Buona flessibilità e scalabilità
● Basato su dependency injection
● Dipendenze “iniettabili” dentro
● Costruttori
● Metodi
Laravel Mario Traetta
12. 12
Service Container: Binding basilari
● Semplici
● Viene restituita un’istanza di dipendenza
● Singleton
● Viene restituito sempre lo stesso oggetto
● D’istanza
● Viene restituita un’istanza già creata
● Con primitive
● Per restituire oggetti con dipendenze
Laravel Mario Traetta
13. 13
Service Container: Altri binding
● Interfaccia con Implementazione
Laravel Mario Traetta
● Contestuale
● Diverse classi
● Stesse dipendenze richieste
● Diverse implementazioni offerte
● D’estensione
14. 14
Service Container: Resolving
● Ottenimento della dipendenza
richiesta
● Il container deduce cosa istanziare
● Metodi espliciti
● Metodo make
● Helper resolve
● Metodo implicito
● Automatic Injection
● Constructor-based type-hinting
Laravel Mario Traetta
15. 15
Service Provider
● Tipi
● Nativi
● Custom
● Due metodi
1) Register
2) Boot
● Tipi di binding
● Bind
● Singleton
Laravel Mario Traetta
16. 16
Service Provider: Registrazione
● “config/app.php”
● All’avvio, tutti i provider sono registrati nel service
container
● Tipi
● Standard Providers
● Registrazione all’avvio
● Deferred Providers
● Registrazione su richiesta
● Property $defer = true
Laravel Mario Traetta
17. 17
Facade
● Interfacce “statiche” a classi
● Disponibili nel service container
● Sintassi intuitiva
● Testabilità e flessibilità
● Estendono la superclasse Facade
● Differisce chiamate su “oggetto
risolto”
Laravel Mario Traetta
18. 18
Facade in tempo reale
● Possibilità di trattare ogni classe come facade
● Template “Facades<NAMESPACE><NOME_CLASSE>”→
Laravel Mario Traetta
19. 19
Contract
● Insieme di interfacce
● Definiscono i servizi principali
● Presentano varie implementazioni
● Fungono da dipendenze esplicite
● Implementabili attraverso type-
hitting
● Presentano controparti per alcune
facade
Laravel Mario Traetta
20. 20
Facade vs Contract
● Strutture più
consolidate
● Non richiedono type-
hinting
● Impiego multiplo di
esse
● Rischio di scope-creep
Laravel Mario Traetta
● Interfacce ben documentabili
● Diverse possibili
implementazioni
● Dipendenze ben tracciabili
● Basso accoppiamento
21. 21
Routing
● Definito mediante la facade “Route”
● Parameteri default con URI e Closure
● I route sono definiti in due file
● Web.php (es.: pagine Blade)
● Api.php (es.: interfacce RESTful)
● Possono ricevere input
Laravel Mario Traetta
23. 23
Routing: Altre funzionalità
Laravel Mario Traetta
● Ridirezionamento da un URI ad un altro
● Visualizzazione diretta di view per URI
● Alias di route (named route)
● Creazione mediante metodo name()
● Accessibile tramite helper route()
24. 24
Middleware
● Filtraggio di richieste HTTP
● Riadattabile per vari compiti
● Assegnabili
● Globalmente per ogni richiesta HTTP
● A route con metodo middleware
● Alcuni offerti dal framework
● Definiti in “app/Http/Kernel.php”
● Possono essere creati dai developer
Laravel Mario Traetta
25. 25
CSRF Protection
● Protegge contro attacchi CSRF (cross-site request forgery)
● Usa “token” CSRF generati automaticamente
● Ogni sessione d’utente riceve un token
● Verifica le richieste effettive dell’utente
● I token sono collegabili a:
● Form HTML5 tramite Blade Engine
● Librerie JavaScript tramite Axios HTTP
Laravel Mario Traetta
26. 26
Controller
● Logica d’applicazione
● Gestione delle richieste
● Usati solitamente per i route
● Più flessibili rispetto alle Closure
● Estendono la superclasse Controller
● La superclasse offre diversi metodi di supporto
● es.: middleware
Laravel Mario Traetta
27. 27
Modalità di definizione di Controller
1)Semplice:
● Le classi contengono diversi metodi
● I metodi possono svolgere diversi compiti
2)A singola azione:
● Presenza di un singolo metodo: “__invoke”
● Controller con una responsabilità specifica
Laravel Mario Traetta
28. 28
Middleware per Controller
● Assegnabili ai route
Laravel Mario Traetta
● Assegnabili nei costruttori
1)Dichiarazione diretta
2)Closure ad-hoc
29. 29
Resource Controller
● Controller per routing di operazioni CRUD
● Esempio → Route::resource('photos', 'PhotoController')
● I resource controller di norma hanno:
● Un set di metodi assegnati a dei route
● Metodi/route disabilitabili
Laravel Mario Traetta
30. 30
Azioni gestite dai Resource Controller
Laravel Mario Traetta
Verb URI Action Route Name
GET /photos index photos.index
GET /photos/create create photos.create
POST /photos store photos.store
GET /photos/{photo} show photos.show
GET /photos/
{photo}/edit
edit photos.edit
PUT / PATCH /photos/{photo} update photos.update
DELETE /photos/{photo} destroy photos.destroy
31. 31
Modalità di dependency injection per Controller
1)Costruttore:
● Type-hinting della dipendenza nel costruttore
● Dipendenza risolta passata al controller
2)Metodo:
● Type-hinting nei metodi del controller
● Dipendenza risolta passata al metodo richiedente
Laravel Mario Traetta
32. 32
Request
● Dependency injection di richieste HTTP
● Type-hinting di un parametro Request
● Nessun conflitto con altri parametri
● Posizionabili dopo il parametro Request
Laravel Mario Traetta
● Type-hinting effettuabile
dentro
● Metodi di controller
● Route con closure
33. 33
Request: Path & Method
● Informazioni HTTP ottenibili
● Path della richiesta
● URL della richiesta
● Metodo della richiesta
Laravel Mario Traetta
34. 34
Request: Input retrieving
● Tutti gli input passati alle richiesta
● Input con default assegnabili
● Input di query
● Restrizione o accesso a determinati input
● Verifica dell’esistenza di input
● Supporto formati
● Array
● File
● JSON
Laravel Mario Traetta
35. 35
Request: Old input (1/2)
● Input “flashabili” tra richiesta attuale e successiva.
● Utile per
● Ripopolare form
● Recuperare sessioni
Laravel Mario Traetta
36. 36
Request: Old input (2/2)
● Ottenibili con metodo
“old”
Laravel Mario Traetta
● Generabili tramite
● Metodo di redirect “withInput”
● Metodo “flash”
● Con accesso ad alcuni input
● Con restrizione ad alcuni input
37. 37
Request: Cookie
● Modalità di accesso
● Facade “Cookie”
● Metodo “cookie”
● Allegabili alle risposte per le
richieste
● Tramite enqueing con Facade
● Tramite metodo cookie
Laravel Mario Traetta
● Generabili con l’helper cookie
38. 38
Response
● Route e controller restituiscono
risultati
● I risultati possono essere
● Semplici dati come stringhe o
array
● Oggetti di risposta HTTP
● Generabili con helper response
● Allegabili
● Header
● Cookie
Laravel Mario Traetta
39. 39
Response: Redirecting
● Redirect semplice
● Helper “redirect”
● Helper “back”
● Redirect su alias di route (“route”)
● Redirect a sito esterno (“away”)
● Redirect su controller (“action”)
● Redirect con flash dell’input (“with”)
Laravel Mario Traetta
40. 40
Response: Altri tipi di risposte
● View
Laravel Mario Traetta
● JSON
● File
● Scaricabili
● Visionabili
41. 41
View
● Pagine HTML mostrate agli utenti
● Logica di presentazione
● Utilizzabile attraverso
● Facade
● Funzione helper
● Input inseribili durante la creazione
Laravel Mario Traetta
42. 42
Database
● Supporto ufficiale a 4 DBMS
● Raw query + Query builder
● Facade DB per connessioni multiple
Laravel Mario Traetta
43. 43
Database: Utility
● Statement
● Statement specifici (CRUD)
● Statement generici (Senza return
value)
● Supporto al data type JSON
● Event listener per query
● Utility migration e seeder
● Integrazione con storage key-value
Redis
Laravel Mario Traetta
44. 44
Eloquent ORM
● Implementa l’Active Record
● Tabella DB Classe “Model”↔
● Model permette di
● Effettuare query sui dati
● Inserire nuovi record
● Modificare record
● Rimuovere record
Laravel Mario Traetta
45. 45
Eloquent ORM: Models
● Estendono la superclasse Model
● Convenzioni per la creazione
● Nome tabella plurale (Flights) Nome classe singolare↔
(Flight)
● Primary key id (autoincrement)→
Laravel Mario Traetta
47. 47
Eloquent ORM: Models Retrieving
● Modalità di selezione
● Tutti i record → <MODEL>::all()
● Record specifici → <MODEL>::where()
● N record specifici → <MODEL>::chunk()
● Singolo record → <MODEL>::find($id) o
<MODEL>::where()->first()
● I risultati restituiti possono essere
● Collection iterabili
● Eccezioni per record inesistenti
Laravel Mario Traetta
48. 48
Eloquent ORM: Altre funzionalità
● Insert
● Update
● Delete
● Rimozione effettiva dei record
● Soft delete
● Record non rimossi
● “Scartati” tramite variabile “deleted_at”
● Delete puro effettuabile
Laravel Mario Traetta
49. 49
Eloquent ORM: Relationships
● Esempio
● Blog con Post e Commenti
● Relazioni definibili
● 1 a 1
● 1 a molti
● Molti a 1 (appartenenza)
● Molti a molti
Laravel Mario Traetta
50. 50
Laradock
● Ambiente completo per sviluppo PHP
● Gestore di container tramite Docker
● Supporto a molti framework PHP
● Switch di versione PHP per progetto
● Docker Compose per applicazioni multi-
container
● Configurazione container con dockefile
Laravel Mario Traetta