Блог Горошко Андрея 1C-Битрикс Валидация данных в D7 ORM: Встроенные и кастомные валидаторы

Валидация данных в D7 ORM: Встроенные и кастомные валидаторы

Средний рейтинг
Еще нет оценок

Валидация — это процесс проверки данных на корректность перед их сохранением. 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.

Мой рейтинг:

Добавить комментарий

Related Post

Работа с файлами и директориями в D7: Классы File, Directory и PathРабота с файлами и директориями в D7: Классы File, Directory и Path

Средний рейтинг Еще нет оценок Классические PHP-функции (file_get_contents, mkdir, unlink) отлично работают, но они не предоставляют объектного интерфейса и не всегда корректно обрабатывают особенности путей и кодировок в Битрикс. Ядро D7 предлагает

Работа с Highload-блоками в Битрикс через D7 ORM: Пошаговое руководствоРабота с Highload-блоками в Битрикс через D7 ORM: Пошаговое руководство

Средний рейтинг Еще нет оценок Highload-блоки (HL-блоки) — это мощный инструмент 1С-Битрикс для хранения произвольных структурированных данных, не являющихся контентом в классическом понимании (как, например, новости или товары). Это могут

Обновление количества товара на складе в BitrixОбновление количества товара на складе в Bitrix

Средний рейтинг Еще нет оценок Обновление количества товара на складе в Bitrix можно сделать так В коде ниже происходит следующее: Мой рейтинг: