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 для ошибки валидации.
Чтобы узнать больше о выражении и о том, какие переменные вам доступны, см. детали оцпии expression ниже.
Tip
Внутренне, это ограничение валидатора выражений использует сервис под названием
validator.expression_language для оценки выражений. Вы можете
декорировать или расширить этот сервис в соответствии со своими потребностями.
Опции
expression
тип: string [опция по умолчанию ]
Выражение, которое будет оценено. Если выражение оценивается, как "false"
значение (используя ==, а не ===), то валидация будет неудачной.
Чтобы узнать больше о синтаксисе языка выражений, см. .
Внутри выражения у вас есть доступ к 2 переменным:
В зависимости от того, как вы используете ограничение, у вас есть доступ к 1 или 2 переменным в вашем выражении:
this: Валидируемый объект (например, экземпляр BlogPost);value: Значение валидируемого свойства (доступно только тогда, когда ограничение применяется напрямую к свойству);
Дата обновления перевода 2023-09-24
groups
тип: array | string по умолчанию: null
Определяет группу или группы валидации ограничений. Прочитайте больше о группах валидации.
message
тип: string по умолчанию: Это значение не является валидным.
Сообщение по умолчаню, поставляемое, когда выражение оценивается, как "false".
Вы можете использовать следующие параметры в этом сообщении:
| ???????? | ???????? |
|---|---|
{{ value }} |
??????? (??????????) ???????? |
{{ label }} |
??????????????? ????? ???? ????? |
negate
тип: boolean по умолчанию: true
Если false, валидация будет неуспешной, если выражение возвращает true.
Дата обновления перевода 2025-07-27
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;
// ...
}