Prologo
Primi Passi
Architettura
Le Basi
Approfondimenti
Package
Note di Rilascio
Schema di Versionamento
Laravel e i suoi altri package first-party seguono Semantic Versioning. Le release principali del framework vengono rilasciate ogni anno (~Q1), mentre le release minori e le patch possono essere rilasciate anche settimanalmente. Le release minori e le patch non dovrebbero mai contenere breaking change.
Quando fai riferimento al framework Laravel o ai suoi componenti dalla tua applicazione o package, dovresti sempre usare un vincolo di versione come ^11.0
, poiché le release principali di Laravel includono breaking change. Tuttavia, ci impegniamo sempre a garantire che tu possa aggiornare a una nuova release principale in un giorno o meno.
Named Argument
I named argument non rientrano nelle linee guida di retrocompatibilità di Laravel. Potremmo decidere di rinominare gli argomenti delle funzioni quando necessario per migliorare il codice di Laravel. Pertanto, utilizzare named argument quando si chiamano i metodi di Laravel dovrebbe essere fatto con cautela e con la consapevolezza che i nomi dei parametri potrebbero cambiare in futuro.
Politica di Supporto
Per tutte le versioni di Laravel, le correzioni di bug sono assicurate per 18 mesi e le fix di sicurezza per 2 anni. Per tutte le librerie aggiuntive, inclusa Lumen, solo l’ultima versione riceve correzioni di bug. Inoltre, assicurati di consultare le versioni del database supportate da Laravel.
Versione | PHP (*) | Rilascio | Correzioni di Bug fino a | Correzioni di Sicurezza fino a |
---|---|---|---|---|
9 | 8.0 – 8.2 | 8 febbraio 2022 | 8 agosto 2023 | 6 febbraio 2024 |
10 | 8.1 – 8.3 | 14 febbraio 2023 | 6 agosto 2024 | 4 febbraio 2025 |
11 | 8.2 – 8.4 | 12 marzo 2024 | 3 settembre 2025 | 12 marzo 2026 |
12 | 8.2 – 8.4 | Q1 2025 | Q3 2026 | Q1 2027 |
(*) Versioni PHP supportate
Laravel 11
Laravel 11 continua il lavoro sui miglioramenti introdotti in Laravel 10.x, presentando una struttura applicativa semplificata, limitazione delle richieste al secondo, routing per il controllo della salute del sistema, rotazione fluida delle chiavi di crittografia, miglioramenti nel testing delle code, mail transport con Resend, integrazione del prompt validator, nuovi comandi Artisan e altro ancora. Inoltre, è stato introdotto Laravel Reverb, un server WebSocket scalabile di first-party, che offre funzionalità in tempo reale alle tue applicazioni.
PHP 8.2
Laravel 11.x richiede almeno PHP 8.2.
Struttura dell’Applicazione Semplificata
La struttura semplificata dell’applicazione Laravel è stata sviluppata da Taylor Otwell e Nuno Maduro.
Laravel 11 introduce una struttura dell’applicazione semplificata per le applicazioni Laravel nuove, senza richiedere modifiche alle applicazioni esistenti. La nuova struttura dell’applicazione mira a offrire un’esperienza più snella e moderna, mantenendo molti dei concetti a cui gli sviluppatori Laravel sono già abituati. Di seguito discuteremo i punti salienti della nuova struttura dell’applicazione di Laravel.
Il file di Bootstrap dell’Applicazione
Il file bootstrap/app.php
è stato rivisitato come file di configurazione dell’applicazione basato su codice. Da questo file, ora puoi personalizzare il routing della tua applicazione, i middleware, i service provider, la gestione delle eccezioni e altro ancora. Questo file unifica una varietà di impostazioni di comportamento dell’applicazione ad alto livello che prima erano distribuite nella struttura dei file della tua applicazione:
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
//
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
Service Provider
Invece della struttura predefinita di Laravel che includeva cinque service provider, Laravel 11 include solo un AppServiceProvider
. Le funzionalità dei service provider precedenti sono state incorporate in bootstrap/app.php
, gestite automaticamente dal framework o possono essere inserite nel AppServiceProvider
della tua applicazione.
Ad esempio, la l’event discovery è ora abilitata di default, eliminando in gran parte la necessità di registrare manualmente eventi e listener. Tuttavia, se hai bisogno di registrare eventi manualmente, puoi farlo semplicemente nel AppServiceProvider
. Allo stesso modo, i route model binding o authorization gate che prima registravi nell’AuthServiceProvider
ora possono essere registrati nel AppServiceProvider
.
Routing API e Broadcast opzionali
I file di route api.php
e channels.php
non sono più presenti di default, poiché molte applicazioni non ne hanno bisogno. Possono però essere creati usando semplici comandi Artisan:
php artisan install:api
php artisan install:broadcasting
Middleware
In precedenza, le nuove applicazioni Laravel includevano nove middleware. Questi middleware eseguivano varie operazioni come autenticare le richieste, trim delle stringhe di input e validare i token CSRF.
In Laravel 11, questi middleware sono stati integrati nel framework stesso, in modo da non appesantire la struttura della tua applicazione. Sono stati aggiunti nuovi metodi per personalizzare il comportamento di questi middleware, che possono essere richiamati dal file bootstrap/app.php
della tua applicazione:
->withMiddleware(function (Middleware $middleware) {
$middleware->validateCsrfTokens(
except: ['stripe/*']
);
$middleware->web(append: [
EnsureUserIsSubscribed::class,
])
})
Poiché tutti i middleware possono essere facilmente personalizzati tramite il file bootstrap/app.php
della tua applicazione, non è più necessario avere una classe "Kernel" HTTP a parte!
Scheduling
Utilizzando il nuovo facade Schedule
, le attività pianificate possono ora essere definite direttamente nel file routes/console.php
della tua applicazione, eliminando la necessità di una classe "kernel" console separata:
use Illuminate\Support\Facades\Schedule;
Schedule::command('emails:send')->daily();
Gestione delle Eccezioni
Come il routing e il middleware, la gestione delle eccezioni può ora essere personalizzata dal file bootstrap/app.php
della tua applicazione invece che da una classe gestore delle eccezioni separata, riducendo il numero complessivo di file inclusi in una nuova applicazione Laravel:
->withExceptions(function (Exceptions $exceptions) {
$exceptions->dontReport(MissedFlightException::class);
$exceptions->report(function (InvalidOrderException $e) {
// ...
});
})
Classe Base Controller
Il controller base incluso nelle nuove applicazioni Laravel è stato semplificato. Non estende più la classe interna Controller
di Laravel, e i trait AuthorizesRequests
e ValidatesRequests
sono stati rimossi. Se necessario, puoi includerli nei singoli controller della tua applicazione:
<?php
namespace App\Http\Controllers;
abstract class Controller
{
//
}
Impostazioni Predefinite dell’Applicazione
Per impostazione predefinita, le nuove applicazioni Laravel utilizzano SQLite per l’archiviazione del database, così come il driver database
per le sessioni, la cache e la coda di Laravel. Questo ti permette di iniziare a costruire la tua applicazione subito dopo aver creato una nuova applicazione Laravel, senza dover installare software aggiuntivo o creare migrazioni di database extra.
Inoltre, nel tempo, i driver database
per questi servizi di Laravel sono diventati abbastanza affidabili per l’uso in produzione in molti contesti applicativi; pertanto, offrono una scelta sensata e unificata sia per applicazioni locali che di produzione.
Laravel Reverb
Laravel Reverb è stato sviluppato da Joe Dixon.
Laravel Reverb offre una comunicazione con WebSocket in tempo reale, veloce e scalabile direttamente nella tua applicazione Laravel, e si integra perfettamente con l’attuale suite di strumenti di broadcasting di eventi di Laravel, come Laravel Echo.
php artisan reverb:start
Inoltre, Reverb supporta la scalabilità orizzontale tramite le capacità di publish/subscribe di Redis, permettendoti di distribuire il traffico WebSocket su più server Reverb di backend, per garantirti le performance di cui hai bisogno.
Per maggiori informazioni su Laravel Reverb, consulta la documentazione di Reverb.
Rate-limiting al Secondo
Il rate-limiting al secondo è stato sviluppato da Tim MacDonald.
Laravel ora supporta la limitazione al secondo per tutti i rate limiter, inclusi quelli per le richieste HTTP e i job in coda. In precedenza, i rate limiter di Laravel erano limitati alla granularità "per minuto":
RateLimiter::for('invoices', function (Request $request) {
return Limit::perSecond(1);
});
Per ulteriori informazioni sul rate-limiting in Laravel, consulta la documentazione sul routing.
Routing ed Health Check
La rotta per lo stato di salute dell’app è stata introdotta da Taylor Otwell.
Le nuove applicazioni Laravel 11 includono una direttiva di routing health
, che istruisce Laravel a definire un semplice endpoint per il controllo dello stato di salute che può essere invocato da servizi di monitoraggio di terze parti o da sistemi come Kubernetes. Per impostazione predefinita, questa route è disponibile su /up
:
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
Quando vengono effettuate richieste HTTP a questa rotta, Laravel emetterà anche un evento DiagnosingHealth
, permettendoti di eseguire controlli di stato aggiuntivi rilevanti per la tua applicazione.
Rotazione Fluida della Chiave di Crittografia
La rotazione fluida della chiave di crittografia è stata introdotta da Taylor Otwell.
Poiché Laravel cripta tutti i cookie, inclusi i cookie di sessione della tua applicazione, ogni richiesta a un’applicazione Laravel si basa sulla crittografia. Tuttavia, a causa di ciò, ruotare la chiave di crittografia della tua applicazione comporterebbe il logout di tutti gli utenti. Inoltre, decriptare i dati che erano stati crittografati con la chiave di crittografia precedente diventerebbe impossibile.
Laravel 11 ti permette di definire le chiavi di crittografia precedenti della tua applicazione come una lista delimitata da virgole tramite la variabile di ambiente APP_PREVIOUS_KEYS
.
Quando cripta i valori, Laravel utilizza sempre la chiave di crittografia "corrente", presente nella variabile di ambiente APP_KEY
. Quando decripta i valori, Laravel proverà prima la chiave corrente. Se la decriptazione fallisce con la chiave corrente, Laravel proverà tutte le chiavi precedenti fino a trovare una chiave in grado di decriptare il valore.
Questo approccio di decriptazione fluida permette agli utenti di continuare a utilizzare la tua applicazione senza interruzioni anche se la chiave di crittografia viene ruotata.
Per ulteriori informazioni sulla crittografia in Laravel, consulta la documentazione sulla crittografia.
Rehashing Automatico delle Password
Il rehashing automatico delle password è stato introdotto da Stephen Rees-Carter.
L’algoritmo predefinito per l’hashing delle password in Laravel è bcrypt. Il "fattore di lavoro" (work factor) per gli hash bcrypt può essere regolato tramite il file di configurazione config/hashing.php
o la variabile d’ambiente BCRYPT_ROUNDS
.
Di solito, il fattore di lavoro di bcrypt dovrebbe aumentare nel tempo man mano che la potenza di elaborazione della CPU/GPU cresce. Se aumenti il fattore di lavoro di bcrypt per la tua applicazione, Laravel ricalcolerà l’hash automaticamente e senza problemi le password degli utenti ogni volta che effettueranno l’autenticazione nella tua applicazione.
Validazione dei Prompt
L’integrazione del validatore dei prompt è stata introdotta da Andrea Marco Sartori.
Laravel Prompts è un package PHP che permette di aggiungere moduli user-friendly alle tue applicazioni da riga di comando, con funzionalità simili ai browser, inclusi placeholder e validazione.
Laravel Prompts supporta la validazione degli input tramite closure:
$name = text(
label: 'Qual è il tuo nome?',
validate: fn (string $value) => match (true) {
strlen($value) < 3 => 'Il nome deve avere almeno 3 caratteri.',
strlen($value) > 255 => 'Il nome non deve superare i 255 caratteri.',
default => null
}
);
Tuttavia, le cose possono complicarsi quando si gestiscono molti input o scenari di validazione complessi. Non temere: in Laravel 11 puoi utilizzare tutta la potenza del validator di Laravel per validare gli input dei prompt:
$name = text('Qual è il tuo nome?', validate: [
'name' => 'required|min:3|max:255',
]);
Test delle interazioni con le code
I miglioramenti ai test delle interazioni con le code sono stati introdotti da Taylor Otwell.
Prima, provare a testare che un job in coda fosse rilasciato, eliminato o fallito manualmente era complicato e richiedeva la definizione di finti e stub personalizzati. Tuttavia, in Laravel 11, puoi facilmente testare queste interazioni della coda usando il metodo withFakeQueueInteractions
:
use App\Jobs\ProcessPodcast;
$job = (new ProcessPodcast)->withFakeQueueInteractions();
$job->handle();
$job->assertReleased(delay: 30);
Per maggiori informazioni sul test di job in coda, consulta la documentazione delle code.
Nuovi Comandi Artisan
I comandi Artisan per la creazione di classi sono stati introdotti da Taylor Otwell.
Sono stati aggiunti nuovi comandi Artisan per permettere la creazione rapida di classi, enum, interfacce e trait:
php artisan make:class
php artisan make:enum
php artisan make:interface
php artisan make:trait
Miglioramenti dei Cast dei Model
I miglioramenti dei cast dei model sono stati introdotti da Nuno Maduro.
Laravel 11 supporta la definizione dei cast nei model utilizzando un metodo invece di una proprietà. Questo permette definizioni di cast più snelle e fluide, specialmente quando si usano cast con argomenti:
/**
* Ottieni gli attributi che devono essere castati.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'options' => AsCollection::using(OptionCollection::class),
// AsEncryptedCollection::using(OptionCollection::class),
// AsEnumArrayObject::using(OptionEnum::class),
// AsEnumCollection::using(OptionEnum::class),
];
}
Per maggiori informazioni sul cast degli attributi, consulta la documentazione di Eloquent.
La funzione once
L’helper once
è stato introdotto da Taylor Otwell e Nuno Maduro.
La funzione helper once
esegue la callback fornita e memorizza il risultato in memoria per tutta la durata della richiesta. Qualsiasi chiamata successiva alla funzione once
con la stessa callback restituirà il risultato precedentemente memorizzato:
function random(): int
{
return once(function () {
return random_int(1, 1000);
});
}
random(); // 123
random(); // 123 (risultato memorizzato)
random(); // 123 (risultato memorizzato)
Per maggiori informazioni sull’helper once
, consulta la documentazione dei helper.
Miglioramento nei test con database In-Memory
Le migliorie ai test con database in-memory sono state introdotte da Anders Jenbo
Laravel 11 offre un notevole aumento di velocità quando si utilizza il database SQLite :memory:
durante i test. Per fare ciò, Laravel ora mantiene un riferimento all’oggetto PDO di PHP e lo riutilizza tra le connessioni, spesso dimezzando il tempo totale di esecuzione dei test.
Supporto Migliorato per MariaDB
Il miglioramento del supporto per MariaDB è stato introdotto da Jonas Staudenmeir e Julius Kiekbusch
Laravel 11 include un supporto migliore a MariaDB. Nelle versioni precedenti di Laravel, era possibile usare MariaDB tramite il driver MySQL di Laravel. Tuttavia, Laravel 11 ora include un driver dedicato per MariaDB che offre impostazioni predefinite migliori per questo database.
Per maggiori informazioni sui driver del database di Laravel, consulta la documentazione del database.
Ispezione dei Database e Operazioni sullo Schema
I miglioramenti all’ispezione del database e operazioni sullo schema sono stati introdotti da Hafez Divandari_
Laravel 11 offre metodi aggiuntivi per le operazioni e l’ispezione dello schema del database, inclusa la modifica, la rinomina e l’eliminazione delle colonne in modo nativo. Inoltre, vengono forniti tipi spaziali avanzati, nomi di schema non predefiniti e metodi schema nativi per manipolare tabelle, viste, colonne, indici e chiavi esterne:
use Illuminate\Support\Facades\Schema;
$tables = Schema::getTables();
$views = Schema::getViews();
$columns = Schema::getColumns('users');
$indexes = Schema::getIndexes('users');
$foreignKeys = Schema::getForeignKeys('users');