Expression

Дата оновлення перекладу 2024-05-29

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 може бути чим завгодно.

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

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
{
    // ...
}

Опція expression - це вираз, який має повернути 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 (використовуючи ==, а не ===), валідація зазнає невдачі. Щоб дізнатися більше про синтаксис мови виразів, див. .

В залежності від того, як ви використовуєте обмеження, у вас є доступ до 1 або 2 змінних у вашому виразі:

  • this: Обʼєкт, який валідується (наприклад, екземпляр BlogPost);
  • value: Значення властивості, яка валідується (доступна лише коли обмеження застосовується напряму до властивості);

Ви також маєте доступ до функції is_valid() у вашому виразі. Ця функція перевіряє, що дані, передані у функцію, не викликають порушень валідації. Дата оновлення перекладу 2023-09-24

groups

тип: array | string за замовчуванням: null

Визначає групу або групи валідації обмеження. Прочитайте більше про групи валідації.

message

тип: string за замовчуванням: This value is not valid.

Повідомлення за замовчуванням, яке постачається, якщо вираз оцінюється як false.

Ви можете використати наступні параметри у цьому повідомленні:

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

negate

тип: boolean за замовчуванням: true

Якщо false, валідація зазнає невдачі, коли вираз повертає true.

Дата оновлення перекладу 2024-05-29

payload

тип: mixed за замовчуванням: null

Ця опція може бути використана, щоб додати довільні дані, специфічні для домену, до обмеження. Сконфігуроване корисне навантаження не використовується компонентом Validator, але його обробка повністю залежить від вас.

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

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;

    // ...
}