合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
[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` | 任何数据操作操作失败时触发 |