When

Дата обновления перевода 2025-07-27

When

Это ограничение позволяет вам применять ограничения валидации только если предоставленное выражение возвращает true. См. Базовое применение, чтобы увидеть пример.

??????????? ? ?????? ??? ????????/??????
?????
????? When
????????? WhenValidator

Базовое применение

Представьте, что у вас есть класс Discount со свойствами type и value:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// src/Model/Discount.php
namespace App\Model;

class Discount
{
    private ?string $type;

    private ?int $value;

    // ...

    public function getType(): ?string
    {
        return $this->type;
    }

    public function getValue(): ?int
    {
        return $this->value;
    }
}

Щоб валідувати обʼєкт, у вас є деякі вимоги:

A) Якщо type - percent, тоді value має бути меншим ніж або дорівнювати 100; B) Якщо type - absolute, тоді value може бути чим завгодно; C) Не зважаючи на значення type, value має бути більшим за 0.

Одним способом досягти цього - це з обмеженням When:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// src/Model/Discount.php
namespace App\Model;

use Symfony\Component\Validator\Constraints as Assert;

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

    // ...
}

Опция expression - это выражение, которое должно вернуть true, чтобы запустить валидацию присоединённых ограничений. Чтобы узнать больше о синтаксисе языка выражений, см. .

Чтобы получить больше информации о выражении и о том, какие переменные вам доступны, см. детали опции expression ниже.

Опции

expression

тип: string|Closure

Условие, которое оценивается для определения, применяется ли ограничение. Оно может быть определено как замыкание или строка с помощью синтаксиса языка выражений. Если результат является неверным значением (false, null, 0, пустая строка или пустой массив), ограничения, определенные в опции constraints, не будут применяться, но ограничения, определенные в опции otherwise (если она указана), будут применяться.

При использовании выражения вы можете получить доступ к следующим переменным:

this
Объект, который валидируется (например, экземпляр Discount).
value
Значения свойства, которое валидируется (доступно только если ограничение применяется к свойству).
context
Объект ExecutionContextInterface, который предоставляет такую информацию как класс, который валидируется, имя свойства, которое валидируется, список нарушений и т.д.

7.2

Переменная context в выражениях была представлена в Symfony 7.2.

При использовании замыкания первый аргумент является объектом, который валидируется.

7.3

Поддержка замыканий в опции expression была представлена в Symfony 7.3 и требует PHP 8.5.

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
// src/Model/Discount.php
namespace App\Model;

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

class Discount
{
    // either using an expression...
    #[Assert\When(
        expression: 'value == "percent"',
        constraints: [new Assert\Callback('doComplexValidation')],
    )]

    // ... or using a closure
    #[Assert\When(
        expression: static function (Discount $discount) {
            return $discount->getType() === 'percent';
        },
        constraints: [new Assert\Callback('doComplexValidation')],
    )]
    private ?string $type;

    // ...

    public function doComplexValidation(ExecutionContextInterface $context, $payload): void
    {
        // ...
    }
}

Вы можете также передать пользовательские переменные, используя опцию values.

constraints

тип: array|Constraint

Одно или несколько ограничений, которые применяются, если выражение возвращает true.

otherwise

тип: array|Constraint

Одно или несколько ограничений, которые используются в случае, если выражение возвращает false.

7.3

Опция otherwise была представлена в Symfony 7.3.

Дата обновления перевода 2023-09-24

groups

тип: array | string по умолчанию: null

Определяет группу или группы валидации ограничений. Прочитайте больше о группах валидации.

Дата обновления перевода 2025-07-27

payload

тип: mixed по умолчанию: null

Эта опция может быть использована, чтобы добавить к ограничению произвольные данные, относящиеся к домену. Сконфигурированная нагрузка не используется компонентом Валидатор, но его обработка полностью зависит от вас.

Например, вы можете захотеть исользовать несколько уровней ошибок, чтобы представить неудачные ограничения в фронт-энде по-разному, в зависимости от степени сложности ошибки.

values

тип: array по умолчанию: []

Значения пользовательских переменных, ипользуемых в выражении. Значения могут быть любым типом (числовым, булевым, строками, null, и т.д.)