Expression

Π”Π°Ρ‚Π° обновлСния ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° 2024-07-25

Expression

Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ позволяСт Π²Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для Π±ΠΎΠ»Π΅Π΅ слоТной ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎΠΉ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ. Π‘ΠΌ. Π‘Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π‘ΠΌ. Callback, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ даст Π²Π°ΠΌ ΡΡ…ΠΎΠΆΡƒΡŽ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ.

??????????? ? ?????? ??? ????????/??????
????? Expression
????????? ExpressionValidator

Π‘Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ класс BlogPost со свойствами category ΠΈ isTechnicalPost:

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

use Symfony\Component\Validator\Constraints as Assert;

class BlogPost
{
    private string $category;

    private bool $isTechnicalPost;

    // ...

    public function getCategory(): string
    {
        return $this->category;
    }

    public function setIsTechnicalPost(bool $isTechnicalPost): void
    {
        $this->isTechnicalPost = $isTechnicalPost;
    }

    // ...
}

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ особСнныС трСбования:

A) Если isTechnicalPost - "true", Ρ‚ΠΎΠ³Π΄Π° category Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ
php, Π»ΠΈΠ±ΠΎ symfony;

B) Если isTechnicalPost - "false", Ρ‚ΠΎΠ³Π΄Π° category ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любой.

Π’ΠΎΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ этого с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ ВыраТСния:

1
2
3
4
5
6
7
8
9
10
11
12
13
// src/Model/BlogPost.php
namespace App\Model;

use Symfony\Component\Validator\Constraints as Assert;

#[Assert\Expression(
    "this.getCategory() in ['php', 'symfony'] or !this.isTechnicalPost()",
    message: 'If this is a tech post, the category should be either php or symfony!',
)]
class BlogPost
{
    // ...
}

ΠžΠΏΡ†ΠΈΡ выраТСния - это Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ "true", Ρ‡Ρ‚ΠΎΠ±Ρ‹ валидация Π±Ρ‹Π»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ синтаксисС языка Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, см. .

Как Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ negate ΠΊΠ°ΠΊ false, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ true для ошибки Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ.

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ свойству ΠΈ всё Ρ€Π°Π²Π½ΠΎ Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° основании Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ всСй сущности. Π­Ρ‚ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ полю. Π’ этом контСкстС, value прСдставляСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ isTechnicalPost.

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

use Symfony\Component\Validator\Constraints as Assert;

class BlogPost
{
    // ...

    #[Assert\Expression(
        "this.getCategory() in ['php', 'symfony'] or value == false",
        message: 'If this is a tech post, the category should be either php or symfony!',
    )]
    private bool $isTechnicalPost;

    // ...
}

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π²Π°ΠΌ доступны, см. Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΎΡ†ΠΏΠΈΠΈ expression Π½ΠΈΠΆΠ΅.

Tip

Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅, это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сСрвис ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ validator.expression_language для ΠΎΡ†Π΅Π½ΠΊΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π΅ΠΊΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ этот сСрвис Π² соотвСтствии со своими потрСбностями.

ΠžΠΏΡ†ΠΈΠΈ

expression

Ρ‚ΠΈΠΏ: string [опция ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ]

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ†Π΅Π½Π΅Π½ΠΎ. Если Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ оцСниваСтся, ΠΊΠ°ΠΊ "false" Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ==, Π° Π½Π΅ ===), Ρ‚ΠΎ валидация Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΉ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ большС ΠΎ синтаксисС языка Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, см. .

Π’Π½ΡƒΡ‚Ρ€ΠΈ выраТСния Ρƒ вас Π΅ΡΡ‚ΡŒ доступ ΠΊ 2 ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ:

Π’ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Ρƒ вас Π΅ΡΡ‚ΡŒ доступ ΠΊ 1 ΠΈΠ»ΠΈ 2 ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π² вашСм Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ:

  • this: Π’Π°Π»ΠΈΠ΄ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, экзСмпляр BlogPost);
  • value: Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ свойства (доступно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ примСняСтся Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΊ свойству);

groups

type: array | string default: null

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

message

Ρ‚ΠΈΠΏ: string ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ являСтся Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΌ.

Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΡŽ, поставляСмоС, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ оцСниваСтся, ΠΊΠ°ΠΊ "false".

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² этом сообщСнии:

???????? ????????
{{ value }} ??????? (??????????) ????????
{{ label }} ??????????????? ????? ???? ?????

negate

Ρ‚ΠΈΠΏ: boolean ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: true

Если false, валидация Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ, Ссли Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true.

Π”Π°Ρ‚Π° обновлСния ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° 2024-07-25

payload

Ρ‚ΠΈΠΏ: mixed ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: null

Π­Ρ‚Π° опция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использована, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, относящиСся ΠΊ Π΄ΠΎΠΌΠ΅Π½Ρƒ. Бконфигурированная Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ Π’Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€, Π½ΠΎ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ зависит ΠΎΡ‚ вас.

НапримСр, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΠΈΡΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ ошибок, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹Π΅ ограничСния Π² Ρ„Ρ€ΠΎΠ½Ρ‚-эндС ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ, Π² зависимости ΠΎΡ‚ стСпСни слоТности ошибки.

values

Ρ‚ΠΈΠΏ: array ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: []

ЗначСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² выраТСниях. ЗначСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ (числовым, Π±ΡƒΠ»Π΅Π²Ρ‹ΠΌ, строками, null ΠΈ Ρ‚.Π΄.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// src/Model/Analysis.php
namespace App\Model;

use Symfony\Component\Validator\Constraints as Assert;

class Analysis
{
    #[Assert\Expression(
        'value + error_margin < threshold',
        values: ['error_margin' => 0.25, 'threshold' => 1.5],
    )]
    private float $metric;

    // ...
}