[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管理
- 請求環境
- 返回響應
- 安全
- 加密/解密
- 安全
- 國際化
- 國際化
- 多語言支持