Re: List of attributes

From: Date: Wed, 28 Oct 2020 17:57:11 +0000
Subject: Re: List of attributes
References: 1 2 3 4 5 6 7 8 9  Groups: php.internals 
Request: Send a blank email to internals+get-112139@lists.php.net to get a copy of this message
On 28/10/2020 16:58, Nicolas Grekas wrote:
about why we'd need nested attributes, here is a discussion about nested validation constraints: https://github.com/symfony/symfony/issues/38503
Thanks, it's useful to see some real-world examples. As I suspected, nearly all of these explicitly take a *list* of nested attributes, not a single attribute.
While most of the constraints receive the nested constraints as simple array, |Collection| however requires a mapping (field to constraint) and is usually combined with other composite constraints, which gives us a second nesting level.
There is much discussion of Collection as an edge case, but although the nested attributes are indeed inside a mapping, the *value* of that mapping is again a list of attributes. Single items are allowed, but this seems to be a special case for convenience. In the below example from https://symfony.com/doc/current/reference/constraints/Collection.html the @Assert\Email could equivalently be written as an array with one item:
    /**
     * @Assert\Collection(
     *     fields = {
     *         "personal_email" = @Assert\Email,
     *         "short_bio" = {
     *             @Assert\NotBlank,
     *             @Assert\Length(
     *                 max = 100,
     *                 maxMessage = "Your short bio is too long!"
     *             )
     *         }
     *     },
     *     allowMissingFields = true
     * )
     */
This reinforces my earlier suggestion (https://externals.io/message/111936#112109) that #[Foo] in a nested context can simply imply an array of one attribute, rendering the above as: #[Assert\Collection(
    fields: [
         "personal_email" => #[Assert\Email],
         "short_bio" => #[
                Assert\NotBlank,
                Assert\Length(
                      max: 100,
                      maxMessage: "Your short bio is too long!"
               )
        ]
    ],
    allowMissingFields: true
] Regards, -- Rowan Tommins (né Collins) [IMSoP]

« previous php.internals (#112139) next »