Создание атрибутов валидации
Атрибуты бывают двух типов: для свойств и для классов.
Атрибуты свойства
Атрибуты свойств реализуют интерфейс \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
. Когда это свойство указано, вместо стандартных ошибок валидаторов будет возвращена одна ошибка с вашим текстом.