Symfony 8.2 Nouveauté Publié le

Lire toute une collection avec [*]

Un chemin comme [*][membres][*][email] remplace les boucles imbriquées : PropertyAccess lit chaque élément d'une collection.

Notions abordées : PropertyAccess

Nouveau dans Symfony 8.2 (en développement). Un chemin de PropertyAccess lit une seule branche : [0][nom], [membres][1][email]. Pour lire le même champ dans chaque élément d'une collection, il fallait une boucle, et une boucle de plus par niveau d'imbrication. Symfony 8.2 ajoute le joker [*], qui désigne tous les éléments.

Avant

$emails = [];
foreach ($equipes as $equipe) {
    $emails[] = array_map(fn (array $membre) => $membre['email'], $equipe['membres']);
}

Depuis Symfony 8.2

$emails = $accessor->getValue($equipes, '[*][membres][*][email]');
// [['ada@…', 'linus@…'], ['grace@…']]

Chaque [*] ajoute un niveau au résultat, et les clés sont remplacées par une liste. Le joker est désactivé par défaut. Dans une application, on l'active par la configuration :

property_access:
    wildcard_reads: true

À faire

Activez le joker dans config/packages/property_access.yaml. Ensuite, réécrivez les deux méthodes de Extracteur avec l'accesseur de l'application (PropertyAccessorInterface), sans boucle ni array_map. Les résultats ne doivent pas changer : l'aperçu /rapport les affiche.

D'où vient la fonctionnalité : la pull request d'origine.