Проверка Целостности Данных

Phalcon\Mvc\Model предоставляет некоторые события для проверки данных и реализации бизнес-логики. Специальное событие validation позволяет нам вызывать встроенные валидаторы для проверки записи. Phalcon имеет несколько встроенных валидаторов, которые можно использовать на этой стадии.

Следующий пример показывает, как это можно использовать:

<?php

namespace Store\Toys;

use Phalcon\Mvc\Model;
use Phalcon\Validation;
use Phalcon\Validation\Validator\Uniqueness;
use Phalcon\Validation\Validator\InclusionIn;

class Robots extends Model
{
    public function validation()
    {
        $validator = new Validation();

        $validator->add(
            'type',
            new InclusionIn(
                [
                    'domain' => [
                        'Mechanical',
                        'Virtual',
                    ]
                ]
            )
        );

        $validator->add(
            'name',
            new Uniqueness(
                [
                    'message' => 'Имя робота должно быть уникальным.',
                ]
            )
        );

        return $this->validate($validator);
    }
}

Приведенный выше пример выполняет проверку с помощью встроенного валидатора InclusionIn. Он проверяет значение поля type в списке доменов. Если значение не включено в метод, то валидатор завершится ошибкой и вернет false.

Идея создания валидаторов - сделать их многоразовыми между несколькими моделями. Валидатор также может быть простым:

<?php

namespace Store\Toys;

use Phalcon\Mvc\Model;
use Phalcon\Mvc\Model\Message;

class Robots extends Model
{
    public function validation()
    {
        if ($this->type === 'Old') {
            $message = new Message(
                'К сожалению, старые роботы больше не допускаются',
                'type',
                'MyType'
            );

            $this->appendMessage($message);

            return false;
        }

        return true;
    }
}

Сообщения Валидатора

Phalcon\Mvc\Model имеет подсистему обмена сообщениями, которая обеспечивает гибкий способ вывода или хранения сообщений проверки, созданных в процессе вставки/обновления.

Каждое сообщение является экземпляром Phalcon\Mvc\Model\Message, и набор сгенерированных сообщений может быть получен с помощью метода getMessages(). Каждое сообщение содержит расширенную информацию, такую как имя поля, создавшего сообщение, или тип сообщения:

<?php

if ($robot->save() === false) {
    $messages = $robot->getMessages();

    foreach ($messages as $message) {
        echo 'Message: ', $message->getMessage();
        echo 'Field: ', $message->getField();
        echo 'Type: ', $message->getType();
    }
}

Phalcon\Mvc\Model может генерировать следующие типы сообщений проверки:

TypeDescription
PresenceOf Генерируется, когда поле с атрибутом non-null в базе данных пытается вставить/обновить null значение
ConstraintViolation Генерируется, когда поле, являющееся частью виртуального внешнего ключа, пытается вставить/обновить значение, не существующее в указанной модели
InvalidValue Генерируется, когда валидация не удалась из-за недопустимого значения
InvalidCreateAttempt Генерируется, когда была предпринята попытка создать запись, которая уже существует
InvalidUpdateAttempt Генерируется, когда была предпринята попытка обновить запись, которая еще не существует

Метод getMessages() может быть переопределен в модели для замены / перевода сообщений по умолчанию, генерируемых автоматически ORM:

<?php

namespace Store\Toys;

use Phalcon\Mvc\Model;

class Robots extends Model
{
    public function getMessages()
    {
        $messages = [];

        foreach (parent::getMessages() as $message) {
            switch ($message->getType()) {
                case 'InvalidCreateAttempt':
                    $messages[] = 'Невозможно создать запись, поскольку она уже существует';
                    break;

                case 'InvalidUpdateAttempt':
                    $messages[] = "Невозможно обновить запись, поскольку она не существует";
                    break;

                case 'PresenceOf':
                    $messages[] = 'Поле ' . $message->getField() . ' являться обязательным';
                    break;
            }
        }

        return $messages;
    }
}

События Сбоя Проверки

Другой доступный тип событий - когда в процессе проверки данных выявляются какие-либо несоответствия:

OperationNameExplanation
Вставка или обновление notSaved Срабатывает, когда операция INSERT или UPDATE не выполняется по какой-либо причине
Вставка, удаление или обновление onValidationFails Срабатывает, когда не выполняется какая-либо операция обработки данных