Проверка моделей
Проверка целостности данных
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