Laravel 8.14.0 cover image

Laravel 8.14.0

alberto • November 12, 2020

release

Laravel raggiunge la versione 8.14.0. Analizziamo le principali novità introdotte negli ultimi rilasci, partendo dalla versione 8.11.0. Le novità piû importanti dei precedenti rilasci sono descritte in [questo articolo]({% post_url 2020-10-15-laravel-8-10 %}).

[8.11] Nuovo Job Middleware per prevenire overlap

Grazie ad un nuovo middleware, è da ora possibile prevenire l'overlap di job all'interno delle nostre code. L'utilizzo è triviale ed è possibile definire la chiave di univocità del job.

// app/Jobs/MyJob.php
use Illuminate\Queue\Middleware\WithoutOverlapping;

public function middleware()
{
    return [new WithoutOverlapping($this->order->id)];
}

A questo link è possibile visionare la PR originale.

[8.11] Nuovo Job Middleware per Rate Limiting

Grazie ad un nuovo middleware, è da ora possibile limitare l'utilizzo di un job. Anche in questo caso l'utilizzo è facile, basta definire un RateLimiter e richiamarlo all'interno del job:

// app/Providers/AppServiceProvider
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('backups', function ($job) {
    return $job->user->vipCustomer()
                ? Limit::none()
                : Limit::perHour(1)->by($job->user->id);
});
// app/Jobs/MyJob.php
use Illuminate\Queue\Middleware\RateLimited;

public function middleware()
{
    return [new RateLimited('backups')];
}

A questo link è possibile visionare la PR originale.

[8.12] Aggiunto un nuovo evento nativo: DatabaseRefreshed

Questo nuovo evento viene emittato al termine dei comandi php artisan migrate:fresh e php artisan migrate:refresh.

[8.12] Nuovi metodi withColumn in Eloquent

Il metodo withCount viene esteso verso altre funzioni di aggregazione:

Post::withMax('comments', 'created_at');
Post::withMin('comments', 'created_at');
Post::withSum('comments', 'foo');
Post::withAvg('comments', 'foo');

Il funzionamento è il medesimo ma in questo caso è possibile ottenere rispettivamente il massimo, il minimo, la somma e la media di un colonna ottenibile tramite una relazione.

A questo link è possibile visionare la PR originale.

[8.12] Nuovi metodo explain in Eloquent

Grazie a questo nuovo metodo, da utilizzare al posto del classico get, è possibile lanciare una query di tipo EXPLAIN.

Post::where('author_id', '123')->explain()

A questo link è possibile visionare la PR originale.

[8.12] Nuovi alias nella validazione dei parametri nelle rotte

Al posto di regexp di validazione delle rotte, da questo rilascio possiamo sfruttare alcuni nuovi metodi nettamente più leggibili.

//codice legacy
Route::get('authors/{author}')->where(['author' => '[0-9]+']);

//nuovo metodo
Route::get('authors/{author}')->whereNumber('author');

A questo link è possibile visionare la PR originale.

[8.13] Nuovi metodi loadAggregate in Eloquent

I metodi withColumn introdotti nella 8.12.0, vengono arricchiti con gli speculari loadAggregate per eseguire una query di aggregazione avendo già a disposizione il modello:

$load->loadMax('comments', 'created_at');
$load->loadMin('comments', 'created_at');
$load->loadSum('comments', 'foo');
$load->loadAvg('comments', 'foo');

A questo link è possibile visionare la PR originale.

[8.14] Possibilità di avere job univoci

Grazie a questo nuovo improvement possiamo assicurarci la certezza che un job venga invocato solamente una volta anche se dispatchato più volte.

L'univocità è definita all'interno del job stesso tramite un metodo uniqueId ed è inoltre possibile definire un timeframe all'interno del quale il controllo di univocità viene effettuato.

use Illuminate\Contracts\Queue\ShouldBeUnique;

class MyUniqueJob implements ShouldQueue, ShouldBeUnique
{
    /**
     * The number of seconds after which the job will no longer stay unique.
     *
     * @var int
     */
     public $uniqueFor = 3600;

    public function uniqueId()
    {
        return $this->user->id;
    }
}

Rispetto al middleware WithoutOverlapping introdotto nella 8.11, questa feature si differenzia per il fatto che utilizzando il middleware il job viene inserito nella coda sempre ed eventualmente ignorato in fase di esecuzione, mentre utilizzando questa ultima modalità il job viene ignorato sin dalla fase di inserimento nella coda.

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: