Новое в Symfony 7.2: Улучшения ограничений
В Symfony 7.2, помимо введения трёх новых ограничений и улучшения ограничения Compound, мы также улучшили другие ограничения.
Добавлен режим валидации для ограничения BIC
Ограничение BIC проверяет, является ли данное значение действительным Business Identifier Code (BIC). Код BIC требует, чтобы буквы были в верхнем регистре, но люди иногда вводят их в нижнем регистре. Вместо того чтобы автоматически нормализовать заданное значение перед валидацией, в Symfony 7.2 мы вводим два режима валидации:
strict
(режим по умолчанию): проверяет заданное значение, не изменяя его;case-insensitive
: изменяет регистр заданного значения на прописной перед валидацией.
// src/Entity/Transaction.php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class Transaction
{
#[Assert\Bic(mode: 'case-insensitive')]
protected string $businessIdentifierCode;
// ...
}
Добавлены ограничения ErrorPath
к Unique
Ограничение Unique
проверяет, что все элементы заданной коллекции уникальны в пределах этой коллекции. Однако, когда происходит ошибка валидации, сообщение об ошибке выводится для всего элемента, а не для какого-то конкретного поля элемента. В Symfony 7.2 мы улучшаем эту ситуацию благодаря новой опции errorPath
.
В следующем примере ошибки валидации будут отображаться в значении key
каждого элемента коллекции:
// Пример класса DTO, используемого в качестве элементов коллекции
class MetadataInput
{
public $key;
public $value;
// ...
}
class Input
{
/** @var MetadataInput[] */
#[Unique(
normalizer: [MetadataInput::class, 'getKeyForUniqueConstraint'],
errorPath: 'key'
)]
public $metadata;
}
Добавлен format
к ограничению Ulid
- Pull Request: [Validator] Add the
format
option to theUlid
constraint to allow accepting different ULID formats #57438 Alexandre Daubois - Pull Request: [Validator] Add support for RFC4122 format in the
Ulid
constraint #57938 Alexandre Daubois
При использовании компонента UID для генерации ULID можно преобразовывать значения ULID в различные форматы:
use Symfony\Component\Uid\Ulid;
$ulid = Ulid::fromString('01E439TP9XJZ9RPFH3T1PYBCR8');
$ulid->toBinary(); // string(16) "\x01\x71\x06\x9d\x59\x3d\x97\xd3\x8b\x3e\x23\xd0\x6d\xe5\xb3\x08"
$ulid->toBase32(); // string(26) "01E439TP9XJZ9RPFH3T1PYBCR8"
$ulid->toBase58(); // string(22) "1BKocMc5BnrVcuq2ti4Eqm"
$ulid->toRfc4122(); // string(36) "0171069d-593d-97d3-8b3e-23d06de5b308"
$ulid->toHex(); // string(34) "0x0171069d593d97d38b3e23d06de5b308"
Однако при использовании ограничения Ulid для валидации этих ULID можно передавать значения только в формате base32
(Ulid::FORMAT_BASE_32
). В Symfony 7.2 мы улучшаем эту ситуацию благодаря новой опции format
:
// src/Entity/File.php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class File
{
#[Assert\Ulid(format: Ulid::FORMAT_RFC4122)]
protected string $identifier;
}
Добавлен контекст к ограничению When
Ограничение When позволяет применять ограничения только в том случае, если заданное выражение возвращает true
. В Symfony 7.2 мы улучшаем его, передавая контекст в выражение, чтобы вы могли принимать решения на его основе. Внутри выражения контекст доступен через переменную context
:
use Symfony\Component\Validator\Constraints as Assert;
// ...
#[Assert\When(
expression: 'this.getType() == "percent" && context.getRoot().ok === true',
constraints: [
// ...
],
)]
private ?int $value;