Re: List of attributes
| From: | Rowan Tommins | 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/38503Thanks, 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]