-
Notifications
You must be signed in to change notification settings - Fork 19
Open
Description
Статья: https://docs.1c-bitrix.ru/pages/framework/validation.html#validaciya-massivov
Описание:
При описании сложных правил, когда валидируется массив объектов допустили ошибку при инициализации атрибута
final class ArticleDto
{
public function __construct(
// ТУТ ОШИБКА
#[ElementsType(TagDto::class)]
public array $tags = []
)
{
}
}Ошибка заключается в том, что примером выше указывается, что первым параметром ожидается объект типа Bitrix\Main\Validation\Rule\Enum\Type|null
А в данном примере мы передаем иной тип данных.
Рекомендуется указать первым параметром null или использовать именованные параметры
#[ElementsType(null, TagDto::class)]
#[ElementsType(className: TagDto::class)]Дополнение:
Если воспользоваться примером скорректировав ElementsType, то мы всегда проходим валидацию
use Bitrix\Main\Validation\Rule\RegExp;
use Bitrix\Main\Validation\Rule\Length;
// DTO для одного элемента (тега)
final class TagDto
{
public function __construct(
#[RegExp('/^[a-z0-9\-_]+$/')]
#[Length(max: 20)]
public string $name
)
{
}
}
final class ArticleDto
{
// Каждый элемент массива будет провалидирован как объект TagDto
public function __construct(
// ТУТ СКОРРЕКТИРОВАЛ
#[ElementsType(null, TagDto::class)]
public array $tags = []
)
{
}
}
// Использование
$article = new ArticleDto();
$article->tags = [
new TagDto('Tag1'),
new TagDto('Tag2'),
new TagDto('Invalid Tag!'), // Вызовет ошибку: не соответствует RegExp
];
$result = $validationService->validate($article);
if (!$result->isSuccess()) {
foreach ($result->getErrors() as $error) {
// Путь к ошибке будет включать индекс элемента, например: "tags.2.name"
echo $error->getCode() . ': ' . $error->getMessage() . PHP_EOL;
}
}Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels