Новое в Symfony 7.2: Улучшения ограничений

Источник: «New in Symfony 7.2: Constraint Improvements»
В Symfony 7.2 добавлены режим валидации для ограничения BIC, errorPath для ограничения Unique, опции format для ограничения Ulid и поддержка контекста для ограничения When.

В Symfony 7.2, помимо введения трёх новых ограничений и улучшения ограничения Compound, мы также улучшили другие ограничения.

Добавлен режим валидации для ограничения BIC

Ограничение BIC проверяет, является ли данное значение действительным Business Identifier Code (BIC). Код BIC требует, чтобы буквы были в верхнем регистре, но люди иногда вводят их в нижнем регистре. Вместо того чтобы автоматически нормализовать заданное значение перед валидацией, в Symfony 7.2 мы вводим два режима валидации:

// 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

При использовании компонента 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;

Комментарии


Дополнительные материалы

Предыдущая Статья

Асимметричная видимость PHP свойств

Следующая Статья

CSS Веерное раскрытие с grid и @property