Expression

Дата оновлення перекладу 2022-12-16

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 $category;

    private $isTechnicalPost;

    // ...

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

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

    // ...
}

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

A) Якщо isTechnicalPost - true, то category має бути php або symfony; B) Якщо isTechnicalPost - false, то category може бути чим завгодно.

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

  • Attributes
  • YAML
  • XML
  • PHP
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: 'Якщо це технічний пост, категорія має бути php або symfony!',
)]
class BlogPost
{
    // ...
}

Опція expression - це вираз, який має повернути true для того, щоб валідація була успішною. Щоб дізнатися більше про синтаксис мови виразів, див. .

Як варіант, ви можете встановити опцію negate як false, щоб ствердити, що вираз має повернути true для невдачі валідації.

6.2

Опція negate була представлена в Symfony 6.2.

Ви також можете приєднати обмеження до конкретної властивості і все ще валідувати, засновуючись на значеннях всієї сутності. Це корисно, якщо ви хочете привʼязати помилку до конкретного поля. У цьому контексті, value представляє значення isTechnicalPost.

  • Attributes
  • YAML
  • XML
  • PHP
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: 'Якщо це технічний пост, категорія має бути php або symfony!',
    )]
    private $isTechnicalPost;

    // ...
}

Щоб дізнатися більше про вираз та які змінні вам доступні, див. деталі опції expression нижче.

Опції

expression

тип: string [опція за замовчуванням ]

Вираз, який буде оцінено. Якщо вираз оцінюється як значення false (використовуючи ==, а не ===), валідація зазнає невдачі.

Щоб дізнатися більше про синтаксис мови виразів, див. .

Всередині виразу, у вас є доступ до 2 змінних:

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

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

Дата оновлення перекладу 2022-12-20

groups

тип: array | string

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

message

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

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

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

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

negate

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

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

6.2

Опція negate була представлена в Symfony 6.2.

Дата оновлення перекладу 2022-12-20

payload

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

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

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

values

тип: array за замовчуванням: []

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

  • Attributes
  • YAML
  • XML
  • PHP
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 $metric;

    // ...
}