Jump to main content Jump to doc navigation

Что такое валидация объектов в xPDO?

Проверка (или валидация) объекта выполняется с помощью xPDOValidator, класса проверки в xPDO. Он автоматически доступен из любого xPDOObject объекта через метод getValidator.

Как это делается?

Валидация может быть выполнена либо при помощи XML схемы, либо во время выполнения с помощью методов xPDOValidator.

Пример использования

Преждем всего давайте создадим нашу модель с этим объектом:

<model package="test" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" tablePrefix="test_">
    <object class="myTest" table="test" extends="xPDOSimpleObject">
        <field key="name" dbtype="varchar" precision="255" phptype="string" default="" null="false" />

        <validation>
            <rule field="name"
                name="preventBlank"
                type="xPDOValidationRule"
                rule="xPDOMinLengthValidationRule"
                value="1"
                message="Пожалуйста укажите имя"
             />
        </validation>
    </object>
</model>

Идем дальше и генерируем модель из XML схемы. А теперь в сниппете вызываем Test:

$output = '';
$modx->addPackage('test','/path/to/my/test/model/','test_');
$obj = $modx->newObject('myTest');
$validator = $obj->getValidator();
if ($validator->validate() == false) {
    $messages = $validator->getMessages();
    foreach ($messages as $errorMsg) {
        $output .= 'Произошла ошибка в поле "'.$errorMsg['field'].'": '.$errorMsg['message'];
    }
}

Будет выведено:

Произошла ошибка в поле "name": Пожалуйста укажите имя.

Правила

Существует три вида правил, callable, preg_match, и xPDOValidationRule.

Правило 'callable'

Это правило, основанное на функции, которую вы передаете.

Это можно сделать несколькими способами. В параметре "rule" схемы вы можете указать имя функции, например "myCallable", а затем обязательно определить функцию, прежде чем вызывать validate() функцию.

В функцию передаются два параметра, первый из которых является значением соответствующего столбца, а второй - массив других атрибутов в поле правила в схеме. Например, модель с правилом может быть следующей:

<rule field="number" name="callable2"
    type="callable" rule="myCallable"
    min="10" message="Значение слишком маленькое. Может быть 10 или больше"
/>

Вызывается при помощи следующего кода:

function myCallable($value,$parameters) {
    return $value < $parameters['min'];
}
$obj->set('number',101);
$validator = $obj->getValidator();
if ($validator->validate() == false) {
    $messages = $validator->getMessages();
    foreach ($messages as $errorMsg) {
        $o .= 'Произошла ошибка в поле "'.$errorMsg['field'].'": '.$errorMsg['message'].'<br />';
    }
}

Будет возвращено:

Произошла ошибка в поле "number": Callable failed.

Вы также можете вызывать методы класса; если у вас есть класс A с методом B, вы можете сделать xml атрибут правила вида A::B для доступа к функции.

Правило 'preg_match'

Это правило представляет собой регулярного выражения, которое должно передаваться в поле для проверки объекта. Пример правила в схеме такой: проверяется, содержит ли поле строку 'php':

<rule field="name" name="phpMatch"
    type="preg_match" rule="/php/i"
    message="Не содержит строку 'php'." />

А в PHP следующий вызов:

$obj->set('name','test');
$validator = $obj->getValidator();
if ($validator->validate() == false) {
    $messages = $validator->getMessages();
    foreach ($messages as $errorMsg) {
        $o .= 'Произошла ошибка в поле "'.$errorMsg['field'].'": '.$errorMsg['message'].'<br />';
    }
}

Вывод будет следующим:

Произошла ошибка в поле "name": Не содержит строку 'php'.

Правило 'xPDOValidationRule'

Это определенный тип правила, основанный на расширении класса класса xPDOValidationRule. Это позволяет делать более сложные правила, а также использовать встроенные. Встроенные правила включают в себя:

  1. xPDOForeignKeyConstraint
  2. xPDOMaxLengthValidationRule
  3. xPDOMaxValueValidationRule
  4. xPDOMinLengthValidationRule
  5. xPDOMinValueValidationRule
  6. xPDOObjectExistsValidationRule

Ожидайте больше документации по этим конкретным правилам.

Смотрите также

  1. xPDOForeignKeyConstraint
  2. xPDOMaxLengthValidationRule
  3. xPDOMaxValueValidationRule
  4. xPDOMinLengthValidationRule
  5. xPDOMinValueValidationRule
  6. xPDOObjectExistsValidationRule