Документация для разработчиков
Темная тема

Создание атрибутов валидации

Атрибуты бывают двух типов: для свойств и для классов.


Атрибуты свойства

Атрибуты свойств реализуют интерфейс \Bitrix\Main\Validation\Rule\PropertyValidationAttributeInterface и метод validateProperty(mixed $propertyValue): ValidationResult. Это нужно, чтобы система распознала их как атрибуты для проверки свойств.

Пример простого атрибута для проверки значения свойства.

use Bitrix\Main\Validation\Rule\PropertyValidationAttributeInterface;
use Bitrix\Main\Validation\ValidationError;
use Bitrix\Main\Validation\ValidationResult;

#[Attribute(Attribute::TARGET_PROPERTY)]
class NotOne implements PropertyValidationAttributeInterface
{
    public function validateProperty(mixed $propertyValue): ValidationResult
    {
        $result = new ValidationResult();
        if ($propertyValue === 1)
        {
            $result->addError(new ValidationError('Значение не должно быть равно 1'));
        }
        
        return $result;
    }
}

Этот атрибут проверяет, что значение свойства не равно 1. Возвращает результат с ошибкой, если это условие нарушено.

Для более сложных проверок можно использовать абстрактный класс \Bitrix\Main\Validation\Rule\AbstractPropertyValidationAttribute, который позволяет комбинировать несколько валидаторов. Нужно будет реализовать метод getValidators(): array, который возвращает список используемых валидаторов.

Пример атрибута Range, который проверяет, что значение находится в заданном диапазоне:

use Attribute;
use Bitrix\Main\Validation\Rule\AbstractPropertyValidationAttribute;
use Bitrix\Main\Validation\Validator\Implementation\Max;
use Bitrix\Main\Validation\Validator\Implementation\Min;

#[Attribute(Attribute::TARGET_PROPERTY)]
final class Range extends AbstractPropertyValidationAttribute
{
    public function __construct(
        private readonly int $min,
        private readonly int $max,
        protected ?string $errorMessage = null
    )
    {
    }

    protected function getValidators(): array
    {
        return [
            new Min($this->min),
            new Max($this->max),
        ];
    }
}

Атрибуты класса

Атрибуты класса реализуют интерфейс \Bitrix\Main\Validation\Rule\ClassValidationAttributeInterface и метод validateObject(object $object): ValidationResult. Общий сценарий валидации установить нельзя.

Пример атрибута, который проверяет количество свойств в классе:

use Bitrix\Main\Validation\ValidationResult;
use Bitrix\Main\Validation\ValidationError;
use Bitrix\Main\Validation\Rule\AbstractClassValidationAttribute;
use ReflectionClass;

#[Attribute(Attribute::TARGET_CLASS)]
class NotOne extends AbstractClassValidationAttribute
{
    public function validateObject(object $object): ValidationResult
    {
        $result = new ValidationResult();
        $properties = (new ReflectionClass($object))->getProperties();
        
        if (count($properties) > 2)
        {
            $result->addError(new ValidationError('Класс содержит слишком много свойств'));
        }
        
        return $result;
    }
}

Этот атрибут проверяет, что в классе не больше двух свойств. Возвращает ошибку, если это условие нарушено.


Собственное сообщение об ошибке

Если наследуетесь от абстрактных классов AbstractClassValidationAttribute или AbstractPropertyValidationAttribute, можно задать собственное сообщение об ошибке через свойство $errorMessage. Когда это свойство указано, вместо стандартных ошибок валидаторов будет возвращена одна ошибка с вашим текстом.



Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
© «Битрикс», 2001-2025, «1С-Битрикс», 2025
Наверх