Laravel 13 featured Large

Le novità di Laravel 13.9.0

Il problema della coerenza tra validazione e UX delle password

Quante volte hai implementato una Password rule lato server con requisiti di lunghezza, maiuscole, numeri e simboli, per poi scoprire che il browser o il password manager suggeriva una password che non rispettava quelle stesse regole? Il risultato era un loop frustrante per l'utente: il campo veniva compilato automaticamente, il form veniva inviato, e la validazione falliva senza un motivo apparente.

Perché conta per la community italiana

Per le startup e le PMI italiane che usano Laravel per costruire SaaS o gestionali, questo genere di attrito nella registrazione si traduce in abbandoni. Avere strumenti nativi per allineare la logica di validazione server-side con i suggerimenti del browser è una di quelle piccole migliorie che fa la differenza nell'esperienza utente finale.

Cosa vedremo in questo articolo

In questo articolo vedremo come usare Password::toPasswordRulesString(), come configurare lo storage su disco per i payload SQS troppo grandi, come sfruttare PendingDispatchcondizionabile e la nuova interfaccia PreparesForDispatch, e tutte le altre novità di Laravel 13.9.0.

Password::toPasswordRulesString()

La feature principale di questa release è il nuovo metodo toPasswordRulesString() sulla classe Password. Converte una Password validation rule in una stringa per l'attributo HTML passwordrules, uno standard introdotto da Apple e supportato da Safari, 1Password e Bitwarden.

Ogni metodo della classe Password viene mappato in un token specifico, per esempio min(n) viene mappato con minlength: n.

L'uso più efficace è combinarlo con Password::defaults(), così la stessa policy definita una volta in AppServiceProvider guida sia la validazione lato server sia i suggerimenti del browser:

// app/Providers/AppServiceProvider.php

use Illuminate\Validation\Rules\Password;

Password::defaults(fn () =>

Password::min(12)->max(64)->mixedCase()->numbers()->symbols()

);

{{-- resources/views/auth/register.blade.php --}}

type="password"

name="password"

autocomplete="new-password"

passwordrules="{{ Password::defaults()->toPasswordRulesString() }}"

/>

Quando l'utente porta il focus sul campo in un browser compatibile, gli verrà suggerita una password già conforme alle tue regole — senza trial-and-error.

Cloud Queue Metrics

Laravel 13.9.0 introduce il monitoraggio delle metriche per le code su Laravel Cloud. Il nuovo decorator Illuminate\Foundation\Cloud\Queue avvolge qualsiasi driver di coda ed emette eventi via socket quando i job vengono accodati, quando inizia l'elaborazione e quando questa si conclude.

Questo consente a Laravel Cloud di ottenere visibilità in tempo reale su throughput, durata di elaborazione e attività dei worker — senza richiedere strumenti di monitoraggio esterni. È supportata anche la cache della configurazione per le queue Cloud: i valori di prefix e suffix vengono ora letti dal file di config, rendendo php artisan config:cache pienamente funzionale.

Storage su Disco per Payload SQS Grandi

SQS ha un limite rigido di 1 MB per messaggio. Se un job serializzato supera questo limite, AWS restituisce un errore InvalidParameterValue. Laravel 13.9.0 risolve il problema nativamente: è possibile configurare uno extended_store_options block nella sezione SQS di config/queue.php per archiviare i payload su disco (es. S3) e mandare solo un puntatore attraverso la coda.// config/queue.php

'sqs' => [

// ...configurazione esistente...

'extended_store_options' => [

'enabled' => env('SQS_STORE_ENABLED', false),

'disk' => env('SQS_STORE_DISK', 's3'),

'prefix' => env('SQS_STORE_PREFIX', ''),

'always' => false, // true = archivia sempre su disco, indipendentemente dalla dimensione

'cleanup' => true, // true = elimina il file dopo l'elaborazione

],

],

Concurrency::run() con Timeout

Il driver process usato da Concurrency::run() aveva un timeout predefinito di 60 secondi non personalizzabile. Con Laravel 13.9.0 è disponibile il parametro timeout direttamente nella chiamata:

use Illuminate\Support\Facades\Concurrency;

Concurrency::run([

fn () => taskLungaElaborazione(),

fn () => altraTaskParallela(),

], timeout: 300); // timeout in secondi

PendingDispatch Condizionabile

PendingDispatch implementa ora il trait Conditionable, che aggiunge i metodi when() e unless(). Questo permette di configurare i job dispatchati inline, senza wrappare la chiamata in if/else:

use App\Jobs\SendPersonalDetailsToFraudDetectionTool;

// Rimuove il delay se il cliente ha già tutti i dati

SendPersonalDetailsToFraudDetectionTool::dispatch($customer)

->when(

$customer->hasSufficientPersonalDetails(),

fn ($job) => $job->withoutDelay()

);

// Aggiunge un delay di 3 minuti altrimenti

SendPersonalDetailsToFraudDetectionTool::dispatch($customer)

->unless(

$customer->hasSufficientPersonalDetails(),

fn ($job) => $job->delay(180)

);

Interfaccia PreparesForDispatch

La nuova interfaccia PreparesForDispatch aggiunge un hook prepareForDispatch() che viene eseguito prima che il job venga inviato alla coda. Il metodo può restituire false per annullare completamente il dispatch — utilissimo per deduplicare ID o verificare che il job sia ancora necessario prima di consumare capacità della coda:

use Illuminate\Contracts\Queue\PreparesForDispatch;

use Illuminate\Contracts\Queue\ShouldQueue;

use Illuminate\Queue\InteractsWithQueue;

use Illuminate\Bus\Queueable;

class SyncPodcastsJob implements ShouldQueue, PreparesForDispatch

{

use Queueable;

public function __construct(public array $podcastIds) {}

public function prepareForDispatch(): bool

{

// Rimuove i duplicati prima del dispatch

$this->podcastIds = array_unique($this->podcastIds);

// Annulla il dispatch se non ci sono ID

return count($this->podcastIds) > 0;

}

public function handle(): void

{

// Logica principale del job

}

}

Novità dalla Community & Ecosistema

Aggiornamenti Recenti Rilevanti

  • Laravel 13 (rilasciato marzo 2026): Supporto nativo PHP Attributes per Eloquent (#[Table], #[Fillable]), Laravel AI SDK integrato, autenticazione Passkey di prima parte.

  • Laravel Cloud: Nuove metriche per le code introdotte a partire da 13.9.0, con visibilità su throughput e worker in tempo reale.

  • Laravel 12 (febbraio 2025): Starter kit ufficiali per React, Svelte, Vue e Livewire con Inertia 2, TypeScript e shadcn/ui.

Conclusione

Laravel 13.9.0 è un rilascio denso di migliorie pratiche che spaziano dall'UX delle password fino alla gestione robusta dei job su SQS e Cloud. L'introduzione di Password::toPasswordRulesString() chiude finalmente il gap tra le regole di validazione server-side e i suggerimenti del browser, mentre PreparesForDispatch e PendingDispatchcondizionabile rendono la gestione dei job molto più espressiva. Come passo successivo, ti consiglio di esplorare le nuove metriche di Laravel Cloud se stai già usando il servizio, oppure di integrare Password::defaults() con il nuovo attributo HTML nel tuo prossimo form di registrazione.

Articoli recenti