New in Symfony 6.2: Conditional Constraints

Contributed by
wuchen90
in #42593.

The Symfony Validator component includes some advanced constraints such as Callback (to implement custom validation rules), Sequentially (to apply a set of rules in order and interrupt them at any point), Compound (to create a set of reusable constraints), etc.

In Symfony 6.2 we're adding another advanced constraint to that list: When, which allows to implement conditional validations.

Consider a Discount class with two properties:

// src/Model/Discount.php
namespace App\Model;

class Discount
{
    private ?string $type;
    private ?int $value;

    // ...
}

To validate the object contents, you need to apply these rules:

  • If type is percent, then value must be less than or equal 100;
  • If type is absolute, then value can be any value;
  • In all cases, the value must be greater than 0.

The new When constraint defines tow main options called expression and constraints. These constraints are only enforced when the result of evaluating the expression is true. You can use it as follows to validate that the value is less than 100 only if the discount type is percent:

use Symfony\Component\Validator\Constraints as Assert;
// ...

class Discount
{
    #[Assert\GreaterThan(0)]
    #[Assert\When(
        expression: 'this.type == "percent"',
        constraints: [
            new Assert\LessThanOrEqual(100, message: 'The value should be between 1 and 100!')
        ],
    )]
    private ?int $value;

    // ...
}

The condition passed to the expression option must use the Symfony ExpressionLanguage syntax. Inside the expression you can use the this variable to refer to the object being validated and value to refer to the property being valuated (this is only available if you apply the When constraint to properties).

Finally, you can combine When with other advanced constraints such as Callback to define complex conditional validations:

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

class Discount
{
    #[Assert\When(
        expression: 'value == "percent"',
        constraints: [new Assert\Callback('doComplexValidation')],
    )]
    private ?string $type;

    // ...
}
            <hr style="margin-bottom: 5px" />
            <div style="font-size: 90%">
                <a href="https://symfony.com/sponsor">Sponsor</a> the Symfony project.
            </div>

https://symfony.com/blog/new-in-symfony-6-2-conditional-constraints?utm_source=Symfony%20Blog%20Feed&utm_medium=feed

Erstellt 3y | 09.11.2022, 09:20:04


Melden Sie sich an, um einen Kommentar hinzuzufügen

Andere Beiträge in dieser Gruppe

A Week of Symfony #964 (June 16–22, 2025)

This week, development activity was intense, with many bug fixes in the maintained branches, numerous deprecation removals in the 8.0 branch, and new features added to the 7.4 branch, including tighte

22.06.2025, 08:10:05 | Symfony
SymfonyOnline June 2025: Speakers, Stats & Replays!

Thank you for joining us at SymfonyOnline June 2025!

What a great edition of SymfonyOnline we’ve just wrapped up! 🎉

We were thrilled to welcome 300 participants from 35 different countries—a

18.06.2025, 08:50:17 | Symfony
A Week of Symfony #963 (June 9–15, 2025)

This week, Symfony celebrated the SymfonyOnline June 2025 conference with great success. Meanwhile, development efforts focused on improving invokable commands for the upcoming Symfony 7.4 version. Th

15.06.2025, 09:10:09 | Symfony
A Week of Symfony #962 (June 2–8, 2025)

This week, development activity focused on the upcoming Symfony 7.4 and 8.0 versions, which will deprecate and remove many features. In addition, we published a case study about Yousign. Finally, we'r

08.06.2025, 07:50:05 | Symfony
Case study - Yousign: Scaling Trust with Smart, Scalable Architecture

As digital signatures become the norm in modern business, Yousign has established itself as a trusted leader across Europe. Behind its simple, intuitive interface is a powerful technical engine, handl

06.06.2025, 07:10:24 | Symfony
SymfonyOnline June 2025 starts next week!

Get ready for the exciting SymfonyOnline June 2025, kicking off in a few days only! There’s still time to register and join the international online Symfony conference—along with pre-conferenc

05.06.2025, 10:20:09 | Symfony
A Week of Symfony #961 (May 26 – June 1, 2025)

This week, Symfony released the stable version of Symfony 7.3, which includes lots of amazing new features. We also published the maintenance versions 6.4.22 and 7.2.7.

Symfony development highlights

01.06.2025, 08:50:16 | Symfony