Expression

Дата обновления перевода 2023-01-13

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 может быть любой.

Вот один из способов достичь этого с ограничением Выражения:

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

Опция выражения - это выражением, которое должно вернуть "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: Значение валидируемого свойства (доступно только тогда, когда ограничение применяется напрямую к свойству);

groups

type: array | string

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.

6.2

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

payload

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

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

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

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;

    // ...
}