11 Валидаторы
Проверка Целостности Данных
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 может генерировать следующие типы сообщений проверки:
Type | Description |
---|---|
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; } }
События Сбоя Проверки
Другой доступный тип событий - когда в процессе проверки данных выявляются какие-либо несоответствия:
Operation | Name | Explanation |
---|---|---|
Вставка или обновление | notSaved |
Срабатывает, когда операция INSERT или UPDATE не выполняется по какой-либо причине |
Вставка, удаление или обновление | onValidationFails |
Срабатывает, когда не выполняется какая-либо операция обработки данных |