[TOC]
# 验证模型
## 验证数据完整性
`Phalcon\Mvc\Model` 提供了几个事件来验证数据和实现业务规则。特殊`验证` 事件允许我们在记录上调用内置验证器。Phalcon公开了一些可在此验证阶段使用的内置验证器。
以下示例显示了如何使用它:
```php
<?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' => 'The robot name must be unique',
]
)
);
return $this->validate($validator);
}
}
```
上面的示例使用内置验证器“InclusionIn”执行验证。它检查域列表中字段`type`的值。如果该值未包含在方法中,则验证器将失败并返回false。
>[warning] 有关验证器的更多信息,请参阅验证文档
创建验证器的想法是使它们在多个模型之间可重用。验证器也可以像下面这样简单:
```php
<?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(
'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
<?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` 可以生成以下类型的验证消息:
| 类型 | 描述 |
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `PresenceOf` | 当数据库上具有非null属性的字段尝试插入/更新空值时生成 |
| `ConstraintViolation` | 当虚拟外键的字段部分尝试插入/更新引用模型中不存在的值时生成 |
| `InvalidValue` | 验证程序因无效值而失败时生成 |
| `InvalidCreateAttempt` | 尝试创建记录但已存在时生成 |
| `InvalidUpdateAttempt` | 尝试更新记录但不存在时生成 |
可以在模型中重写`getMessages()`方法,以替换/转换ORM自动生成的默认消息:
```php
<?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[] = '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` | 任何数据操作操作失败时触发 |
- 常规
- Welcome
- 贡献
- 生成回溯
- 测试重现
- 单元测试
- 入门
- 安装
- Web服务器设置
- WAMP
- XAMPP
- 教程
- 基础教程
- 教程:创建一个简单的REST API
- 教程:Vökuró
- 提升性能
- 教程:INVO
- 开发环境
- Phalcon Compose (Docker)
- Nanobox
- Phalcon Box (Vagrant)
- 开发工具
- Phalcon开发者工具的安装
- Phalcon开发者工具的使用
- 调试应用程序
- 核心
- MVC应用
- 微应用
- 创建命令行(CLI)应用程序
- 依赖注入与服务定位
- MVC架构
- 服务
- 使用缓存提高性能
- 读取配置
- 上下文转义
- 类加载器
- 使用命名空间
- 日志
- 队列
- 数据库
- 数据库抽象层
- Phalcon查询语言(PHQL)
- ODM(对象文档映射器)
- 使用模型
- 模型行为
- ORM缓存
- 模型事件
- 模型元数据
- 模型关系
- 模型事务
- 验证模型
- 数据库迁移
- 分页
- 前端
- Assets管理
- 闪存消息
- 表单
- 图像
- 视图助手(标签)
- 使用视图
- Volt:模板引擎
- 业务逻辑
- 访问控制列表(ACL)
- 注解解析器
- 控制器
- 调度控制器
- 事件管理器
- 过滤与清理
- 路由
- 在session中存储数据
- 生成URL和路径
- 验证
- HTTP
- Cookies管理
- 请求环境
- 返回响应
- 安全
- 加密/解密
- 安全
- 国际化
- 国际化
- 多语言支持