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, ΠΈ Ρ‚.Π΄.)