When

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

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
// 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!')
        ],
    )]
    private ?int $value;

    // ...
}

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

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

Опции

expression

тип: string

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

Чтобы узнать больше о синтаксисе языка выражений, см. .

В зависимости от того, как вы используете ограничение, у вас есть доступ к 1 или 2 переменным в вашем выражении:

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

Переменная value может быть ипользована, когда вы хотите выполнить более сложную валидацию, основываясь на ее значении:

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

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;
    // ...

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

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

constraints

тип: array|Constraint

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

groups

type: array | string default: null

It defines the validation group or groups of this constraint. Read more about validation groups.

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

payload

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

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

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

values

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

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