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 |
Срабатывает, когда не выполняется какая-либо операция обработки данных |