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
: Значение валидируемого свойства (доступно только тогда, когда ограничение применяется напрямую к свойству);
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
.
Дата обновления перевода 2025-02-05
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;
// ...
}