New in Symfony 5.4: Nested Validation Attributes

Contributed by Alexandre Daubois in #41994.

In Symfony 5.2 we added a feature to define validation constraints as PHP attributes. Attributes were very recent at that time, because they had just been added to PHP 8.0. The only caveat was that you couldn't nest PHP attributes, so you couldn't use them with constraints such as AtLeastOneOf and Collection. Thankfully, PHP 8.1, released on November 25, 2021, adds support for nested attributes. That's why in Symfony 5.4 you'll be able to use PHP attributes to define all existing constraints, without any exemption. The trick that enables this feature is to use the new keyword to create the nested attribute:

    1

2 3 4 5 6 7

[Attribute1(new SubAttribute1())]

[Attribute2([new SubAttribute2(), new SubAttribute3()])]

[Attribute3(someProperty: new SubAttribute4())]

class SomeClass { // ... }

This is how it looks in practice when using Symfony Validator constraints in a complex example:

    1

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 use Symfony\Component\Validator\Constraints as Assert;

class SomeClass {

[Assert\All([

    new Assert\NotNull(),
    new Assert\Range(min: 3),
])]
#[Assert\Collection(
    fields: [
        'foo' => [
            new Assert\NotNull(),
            new Assert\Range(min: 3),
        ],
        'bar' => new Assert\Range(min: 5),
        'baz' => new Assert\Required([new Assert\Email()]),
        'qux' => new Assert\Optional([new Assert\NotBlank()]),
    ],
    allowExtraFields: true
)]
private $property1;

#[Assert\AtLeastOneOf(
    constraints: [
        new Assert\NotNull(),
        new Assert\Range(min: 3),
    ],
    message: 'foo',
    includeInternalMessages: false,
)]
#[Assert\Sequentially([
    new Assert\NotBlank(),
    new Assert\Range(min: 5),
])]
private $property2;

// ...

}

                Sponsor the Symfony project.

https://symfony.com/blog/new-in-symfony-5-4-nested-validation-attributes?utm_source=Symfony%20Blog%20Feed&utm_medium=feed

Creato 4y | 11 nov 2021, 02:20:11


Accedi per aggiungere un commento

Altri post in questo gruppo

A Week of Symfony #958 (May 5–11, 2025)

This week, we published the second beta of Symfony 7.3, ahead of its final release later in May 2025. Meanwhile, we continued sharing posts about the new features of Symfony 7.3 and the upcoming Symfo

11 mag 2025, 09:50:17 | Symfony
Symfony 7.3.0-BETA2 released

Symfony 7.3.0-BETA2 has just been released. This is a pre-release version of Symfony 7.3. If you want to test it in your own applications before its final release, run the following commands:

10 mag 2025, 13:10:15 | Symfony
New in Symfony 7.3: Mailer Security Improvements

The Symfony Mailer component provides many security-related features like signing and encrypting email messages. In Symfony 7.3 we're pushing those features even further to give you greater control an

9 mag 2025, 09:20:10 | Symfony
SymfonyOnline June 2025: Detect Hidden Defects: Check Your PHP Tests

SymfonyOnline June 2025 is almost here, starting in almost 2 months on:

June 10-11: Workshop days. It is possible to attend 1 two-day training or 2 one-day trainings. June 12-13: Online confe

8 mag 2025, 14:40:19 | Symfony
New in Symfony 7.3: JsonPath Component

Contributed by Alexandre Daubois in

8 mag 2025, 10:10:10 | Symfony
SymfonyOnline June 2025: Combining Turbo, LiveComponent & Stimulus... the Right Way?

SymfonyOnline June 2025 is almost here, starting in almost 2 months on:

June 10-11: Workshop days. It is possible to attend 1 two-day training or 2 one-day trainings. June 12-13: Online confe

7 mag 2025, 13:10:15 | Symfony
New in Symfony 7.3: New and Improved Console Helpers

Symfony 7.3 introduces powerful improvements to the Console component, beyond the much-anticipated invokable commands and input attributes. This version also brings new helpers and features designed t

7 mag 2025, 08:30:04 | Symfony