Spec-Zone.ru › Phalcon 3

Проверка моделей

Проверка целостности данных

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

Следующий пример демонстрирует его использование:

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" => "The robot name must be unique",
                ]
            )
        );

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

В приведенном выше примере выполняется проверка с использованием встроенного валидатора «InclusionIn». Он проверяет значение поля «type» в списке доменов. Если значение не входит в метод, то валидатор завершится неудачей и вернет false.

Для получения дополнительной информации о валидаторах, см. Документацию по валидации.

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

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(
                "Sorry, old robots are not allowed anymore",
                "type",
                "MyType"
            );

            $this->appendMessage($message);

            return false;
        }

        return true;
    }
}

Сообщения о валидации

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

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

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 может генерировать следующие типы сообщений о валидации:

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

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

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[] = "The record cannot be created because it already exists";
                    break;

                case "InvalidUpdateAttempt":
                    $messages[] = "The record cannot be updated because it doesn't exist";
                    break;

                case "PresenceOf":
                    $messages[] = "The field " . $message->getField() . " is mandatory";
                    break;
            }
        }

        return $messages;
    }
}

События при неудачной валидации

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

Операция Имя Описание
Вставка или обновление notSaved Вызывается, когда операция INSERT или UPDATE завершается неудачно по любой причине
Вставка, удаление или обновление onValidationFails Вызывается, когда любая операция обработки данных завершается неудачно

© 2011–2017 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/latest/reference/model-validation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API