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

Created 3y | Nov 9, 2022, 9:20:04 AM


Login to add comment

Other posts in this group

SymfonyOnline June 2025:  Keynote “Symfony in 2025, Scaling to Zero.”

SymfonyOnline June 2025 is almost here, starting in a few weeks on:

June 10-11: Workshop days. June 12-13: Online conference days in English. All talks will be available for replay as soon as

May 16, 2025, 3:10:26 PM | Symfony
New in Symfony 7.3: Dependency Injection Improvements

Symfony 7.3 introduces several enhancements to the DependencyInjection component that simplify service configuration, make autoconfiguration more flexible, and enable environment-specific aliasing.

S

May 16, 2025, 8:10:11 AM | Symfony
New in Symfony 7.3: Namespaced Caches

Contributed by Nicolas Grekas in

May 15, 2025, 8:50:14 AM | Symfony
SymfonyOnline June 2025: Building an Automated Trading System with Symfony

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

May 14, 2025, 2:30:11 PM | Symfony
New in Symfony 7.3: Security Improvements

Symfony security includes several significant improvements and new features in Symfony 7.3.

Deprecate eraseCredentials() Method… https://symfony.com/blog/new-in-symfony-7-3-security-improvements?utm_

May 14, 2025, 9:50:05 AM | Symfony
SymfonyOnline June 2025: Demystify the Magic of the Container🪄

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

June 10-11: Workshop days June 12-13: Online conference days in English. All talks will be available for replay as soon

May 13, 2025, 3:20:17 PM | Symfony
New in Symfony 7.3: ObjectMapper Component

Contributed by Antoine Bluchet in

May 13, 2025, 8:20:10 AM | Symfony