Skip to content

Некорректный пример валидации массивов #84

@sholokhov-daniil

Description

@sholokhov-daniil

Статья: 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;
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions