Валидация — это процесс проверки данных на корректность перед их сохранением. D7 ORM предоставляет мощный механизм валидаторов, который описывается прямо в getMap() вашей сущности.
Это позволяет держать правила проверки рядом с описанием полей.
Как это работает?
В описании поля в getMap() добавляется ключ validation.
Его значением должна быть анонимная функция, которая возвращает массив объектов-валидаторов.
// В классе вашей сущности *Table
public static function getMap()
{
return [
new Entity\IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new Entity\StringField('TITLE', [
'required' => true, // Поле обязательное
'validation' => function() {
return [
// Массив валидаторов для этого поля
new \Bitrix\Main\Entity\Validator\Length(null, 255),
];
}
]),
// ... другие поля
];
}
Валидация срабатывает автоматически при вызове add() и update().
Если данные не проходят проверку, метод вернет Result с ошибками.
Встроенные валидаторы
Битрикс предоставляет набор готовых валидаторов для самых частых задач.
1. Validator\Length — Проверка длины
'validation' => function() {
return [
new \Bitrix\Main\Entity\Validator\Length(10, 255) // min 10, max 255 символов
];
}
2. Validator\Range — Проверка диапазона чисел
'validation' => function() {
return [
new \Bitrix\Main\Entity\Validator\Range(0, 100) // от 0 до 100 включительно
];
}
3. Validator\RegExp — Проверка по регулярному выражению
'validation' => function() {
return [
// Проверка, что значение состоит только из латинских букв и цифр
new \Bitrix\Main\Entity\Validator\RegExp('/^[a-zA-Z0-9]+$/')
];
}
4. Validator\Unique — Проверка на уникальность
Этот валидатор проверяет, что в таблице еще нет записи с таким же значением в этом поле.
'validation' => function() {
return [
new \Bitrix\Main\Entity\Validator\Unique('Поле должно быть уникальным.')
];
}
Создание кастомного валидатора
Для сложной бизнес-логики можно создать свой класс-валидатор. Он должен наследоваться от \Bitrix\Main\Entity\Validator\Base и реализовывать метод validate.
Задача: Создать валидатор, который проверяет, что строка не содержит запрещенных слов («спам», «реклама»).
Шаг 1: Создаем класс валидатора
// /local/php_interface/lib/Validators/StopWordsValidator.php
namespace Local\Validators;
use Bitrix\Main\Entity\Validator\Base;
use Bitrix\Main\ArgumentException;
class StopWordsValidator extends Base
{
protected $stopWords = ['спам', 'реклама'];
public function __construct($errorPhrase = null)
{
// Можно передать кастомное сообщение об ошибке
if ($errorPhrase !== null) {
$this->errorPhrase = $errorPhrase;
} else {
$this->errorPhrase = 'Поле содержит запрещенные слова.';
}
}
public function validate($value, $primary, array $row, \Bitrix\Main\ORM\Fields\Field $field)
{
foreach ($this->stopWords as $word) {
if (mb_stripos($value, $word) !== false) {
return $this->errorPhrase;
}
}
return true;
}
}
Шаг 2: Применяем валидатор в getMap()
// В классе *Table
// Не забудьте подключить класс валидатора через use
use Local\Validators\StopWordsValidator;
public static function getMap()
{
return [
// ...
new Entity\StringField('COMMENT', [
'validation' => function() {
return [
new StopWordsValidator('Ваш комментарий содержит недопустимые слова.'),
];
}
]),
];
}
Теперь при попытке сохранить комментарий со словом «спам», метод add/update вернет ошибку.
Вывод:
Система валидации D7 ORM — это мощный и гибкий инструмент для обеспечения целостности данных.
Описывая правила прямо в getMap(), вы создаете надежную и самодокументируемую модель данных.
Начинайте с использования встроенных валидаторов и не бойтесь создавать свои для реализации специфической бизнес-логики.
D7 ORM, валидация, Validator, RegExp, Range, Unique, кастомный валидатор, проверка данных, getMap.