验证模型
最后更新于:2022-04-02 05:14:39
[TOC]
# 验证模型
## 验证数据完整性
`Phalcon\Mvc\Model` 提供了几个事件来验证数据和实现业务规则。特殊`验证` 事件允许我们在记录上调用内置验证器。Phalcon公开了一些可在此验证阶段使用的内置验证器。
以下示例显示了如何使用它:
```php
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。
>[warning] 有关验证器的更多信息,请参阅验证文档
创建验证器的想法是使它们在多个模型之间可重用。验证器也可以像下面这样简单:
```php
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()`方法检索。每条消息都提供扩展信息,例如生成消息的字段名称或消息类型:
```php
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` | 当数据库上具有非null属性的字段尝试插入/更新空值时生成 |
| `ConstraintViolation` | 当虚拟外键的字段部分尝试插入/更新引用模型中不存在的值时生成 |
| `InvalidValue` | 验证程序因无效值而失败时生成 |
| `InvalidCreateAttempt` | 尝试创建记录但已存在时生成 |
| `InvalidUpdateAttempt` | 尝试更新记录但不存在时生成 |
可以在模型中重写`getMessages()`方法,以替换/转换ORM自动生成的默认消息:
```php
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;
}
}
```
## 验证失败的事件
当数据验证过程发现任何不一致时,可以使用另一种类型的事件:
| 操作 | 名称 | 说明 |
| ------------------------ | ------------------- | ---------------------------------------------------------------------- |
| Insert or Update | `notSaved` | `INSERT` 或 `UPDATE` 操作因任何原因失败时触发 |
| Insert, Delete or Update | `onValidationFails` | 任何数据操作操作失败时触发 |
';