L’équipe Laravel a publié la version 9.4 avec la possibilité de remplacer les cookies CSRF, une méthode Str :: lcfirst(), un mécanisme de nouvelle tentative facultatif pour les mailables en file d’attente, et plus encore :

Autoriser l’extension du cookie CSRF de VerifyCsrfToken

@jaggy a contribué à la possibilité de remplacer le VerifyCsrfToken en définissant une méthode newCookie sur le middleware CSRF étendu d’une application :

class VerifyCsrfToken extends Middleware {
    protected function newCookie($request, $config)
    {
        return new Cookie(
            "XSRF-TOKEN-{$request->user()->type}",
            $request->session()->token(),
            $this->availableAt(60 * $config['lifetime']),
            $config['path'],
            $config['domain'],
            $config['secure'],
            false,
            false,
            $config['same_site'] ?? null,
        );
    }
}

Bien que la plupart des applications n’aient pas besoin de remplacer le comportement par défaut, l’auteur du PR fournit le cas d’utilisation suivant :

Dans certains cas, dans les systèmes multilocataires, l'utilisateur peut souhaiter modifier le nom du jeton CSRF pour éviter les erreurs 419. Plusieurs fournisseurs d'authentification rendent cela possible également, principalement dans les requêtes XHR. Cela permet également aux systèmes multilocataires de mettre à jour le domaine du jeton (c'est-à-dire d'extraire le domaine personnalisé du locataire actuel) à partir de la couche middleware.

Je pense que cela va beaucoup aider les personnes qui utilisent Inertia pour permettre la personnalisation de la façon dont XSRF-TOKEN est nommé en ajoutant l'ID de locataire, ou même le type d'utilisateur.

Ajouter la méthode soleValue aux constructeurs de requêtes

Matthew Hailwood a contribué à une nouvelle méthode soleValue() pour interroger les constructeurs afin de renvoyer une colonne à partir de la valeur unique au lieu de l’enregistrement entier :

// saute s'il n'y a pas exactement un résultat,
// mais retourne un objet
$query->sole(['id']);
 
// retourne juste la valeur, mais pas de sécurité autour
// il y a exactement un résultat
$query->value('id');
 
// Pour obtenir l'ID, nous devons faire
$query->sole(['id'])->id;

Cette mise à jour permet l’utilisation suivante :

// saute s'il n'y a pas exactement un résultat,
// mais retourne un objet
$query->sole(['id']);
 
// retourne juste la valeur, mais pas de sécurité autour
// il y a exactement un résultat
$query->value('id');
 
// Bails s'il n'y a pas exactement un résultat
// et retourne juste la valeur
$query->soleValue('id');

Méthode Add String lcfirst()

Vincent Prat a contribué une méthode lcfirst() aux classes Str et Stringable, qui prend également en charge les caractères non-ASCII :

Str::lcfirst('Laravel'); // laravel
Str::lcfirst('Laravel framework'); // laravel framework
Str::lcfirst('Мама'); // мама
Str::lcfirst('Мама мыла раму'); // мама мыла раму

Ajouter la colonne « Mutex » à la commande schedule:list

@madman-81 a ajouté une colonne Has Mutex à la commande schedule:list, indiquant si un mutex bloque une commande. Le problème n° 41311 explique comment cette colonne peut aider à déboguer tout problème de planificateur :

Aujourd'hui, j'ai rencontré un problème avec une tâche planifiée qui n'était pas en cours d'exécution. Il m'a fallu un certain temps pour comprendre ce qui se passait, principalement parce que la liste schedule:list ne montrait rien d'anormal et mettait à jour l'horodatage "Next Due" comme prévu. Cependant, les tâches n'ont pas été exécutées. Longue histoire, les tâches se sont bloquées parce qu'un mutex n'a pas été effacé, probablement à cause d'un redémarrage imprévu du serveur.

Voici un exemple de la sortie basée sur le problème ci-dessus :

$ php artisan schedule:list
+----------------------------------------------------------+-------------+--------------------+----------------------------+----------------------------+
| Command                                                  | Interval    | Description        | Next Due                   | Has Mutex                  |
+----------------------------------------------------------+-------------+--------------------+----------------------------+----------------------------+
| '/usr/bin/php8.0' 'artisan' mycommands:something         | */2 * * * * | Process something  | 2022-03-03 10:22:00 +00:00 | Yes                        |
| '/usr/bin/php8.0' 'artisan' mycommands:otherthing        | */2 * * * * | Process otherthing | 2022-03-03 10:22:00 +00:00 |                            |
+----------------------------------------------------------+-------------+--------------------+----------------------------+----------------------------+

Prise en charge de la modification d’un type de colonne char

Hafez Divandari a contribué à la possibilité de modifier un type de colonne char :

Schema::table('users', function (Blueprint $table) {
    $table->char('name', 50)->nullable()->change();
});

[Le] package doctrine/dbal prend en charge la modification des types de colonne char en tant que StringType :: class en définissant l’option fixe sur true.

Ainsi, ce PR mappe Laravel char sur son type de chaîne équivalent Doctrine et définit l’option fixe sur true qui permet finalement à l’extrait SQL de déclarer une colonne CHAR.

Mécanisme de nouvelle tentative pour les e-mails en file d’attente

MaxGiting a contribué à la possibilité de spécifier une méthode retryUntil() ou une propriété timeoutAt pour les mailables en file d’attente. Consultez la demande d’extraction #41393 pour plus de détails.