
Laravel 8.21.0
alberto • January 8, 2021
releaseLaravel raggiunge la versione 8.21.0. Analizziamo le principali novità introdotte negli ultimi rilasci, partendo dalla versione 8.15.0. Le novità piû importanti dei precedenti rilasci sono descritte in [questo articolo]({% post_url 2020-11-12-laravel-8-14 %}).
[8.15] Supporto per i lock per tutti i tipi di cache
Fino alla release precedente il meccanismo di locking per la cache non era disponibile per i driver file
e null
. Grazie a questa PR la feature diventa accessibile a tutti i driver rendendo di fatto disponibili funzionalità come il session blocking, il middleware WithoutOverlapping
e i job univoci.
A questo link è possibile visionare la PR originale.
[8.15] Aggiunta di constraint nei caricamenti eager delle relazioni MorphTo
Da questo rilascio è possibile applicare limitazioni particolari, in fase di eager loading, per ciascuna tipologia di oggetto polimorfico.
$activities = ActivityFeed::query()
->with(['parentable' => function (MorphTo $morphTo) {
$morphTo->constrain([
Event::class => function (Builder $query) {
$query->where('available', 1);
},
Photo::class => function (Builder $query) {
$query->where('size', '>', '1024');
},
]);
}])->get();
In questo esempio, grazie al metodo constrain
è possibile ottenere tutti gli oggetti ActivityFeed
con la property parentable
valorizzata come Event
, ma solo se disponibile, o come Photo
, ma solo se la size è superiore a 1024.
A questo link è possibile visionare la PR originale.
[8.16] Integrazione con Ably
Il modulo di event broadcasting si arricchisce di un nuovo provider integrato nativamente. Ably è una piattaforma scalabile pub/sub per implementare servizi in realtime.
L'integrazione è stata realizzata direttamente da Otwell. A questo link è possibile visionare il dettaglio del commit.
[8.16] Nuovo metodo splitIn
per la classe Collection
Questo nuovo metodo permette di suddividere una collection in più gruppi mantenendo solamente l'ultimo di questi a dimensione variabile.
A questo link è possibile visionare la PR originale arricchita di esempi e di una discussione su quale sia il miglior nome da dare al metodo.
[8.16] Possibilità di ritardare notifiche per canale
Il metodo delay
utile per posticipare l'invio di una notifica tramite code, ora accetta anche una mappa chiave valore per permettere una configurazione diversa in base al driver utilizzato.
User::first()->notify(
(new NewOrder(Order::first()))->delay([
'mail' => now()->addDay(),
'sms' => 300,
])
);
A questo link è possibile visionare la PR originale.
[8.17] Transaction manager
A grande richiesta viene introdotta un transaction manager a livello dell'applicazione che si occupa di registrare tutto quello che avviene in termini di transazioni, commit e rollback. Questo componente permette di condividere la logica delle transazioni a database tra le varie componenti dell'applicazione.
Capiamo meglio analizzando l'esempio suggerito dall'autore della PR:
//UserController.php
DB::transaction(function () {
$user = User::create([...]); //it emits users.created event
$user->teams()->create([...]);
});
//UserListener.php
public function handle(){
DB::afterCommit(function (){
Mail::send(...);
});
}
In questo esempio abbiamo una transazione, invocata per esempio in un controller, che incapsula il salvataggio di un utente e l'assegnazione dello stesso in una particolare squadra. La creazione dell'utente emette un evento che viene recepito dallo UserListener tramite il metodo handle
.
Il comportamento che si ottiene è questo:
- parte la transazione
- viene creato un utente
- viene invocato il metodo
handle
diUserListener
- viene registrata nell'
afterCommit
l'invio di una mail - viene creata la squadra
- viene committata la transazione
- i dati vengono persistiti a database
- viene inviata la mail
In questo modo è possibile contemporaneamente utilizzare le transazioni e sfruttare i comportamenti base di standard come per esempio gli eventi emittati da Eloquent.
A questo link è possibile visionare la PR originale.
[8.19] Nuovo comando nativo: schedule:list
Grazie al comando schedule:list
, da questo rilascio possiamo monitorare, come avviene per esempio con route:list
, tutti i comandi schedulati con la rispettiva formula cron.
A questo link è possibile visionare la PR originale.
[8.21] Gestione errori migliorata per parametri mancanti nelle rotte
L'errore in caso di parametri mancanti è stato migliorato da:
Missing required parameters [Route: admin.client.form.show] [URI: admin/client/{client}/form/{webform}]
a
Missing required parameter [Route: admin.client.form.show] [URI: admin/client/{client}/form/{webform}] [Missing Parameter: client]
Da notare che alla fine del messaggio è stato aggiunto il nome del parametro non valorizzato.
A questo link è possibile visionare la PR originale.
Changelog
L'articolo introduce brevemente quelle che ritieniamo essere le modifiche piû impattanti. Ma c'è anche altro. I più curiosi possono spulciare le altre novità direttamente nei changelog ufficiali: