校验
ORM 模型 和 校验 库 是紧密集成的 并且 控制器也配备了一个非常灵活的 [ORM_Validation_Exception] 来帮助你快速处理由于基本的 CRUD 操作产生的错误 原文.
定义验证规则
验证规则可以定义到 ORM::rules() 方法中. 这个方法 返回一个像这样 要传递给 校验 对象的 一个数组 原文:
public function rules(){return array('username' => array(// 调用 Valid::not_empty($value) 方法;array('not_empty'),// 调用 Some_Class::some_method('param1', 'param2');array('Some_Class::some_method', array('param1', 'param2')),// 调用 A_Class::a_method($value);array(array('A_Class', 'a_method')),// 使用 匿名函数 并 传递字段值和校验对象array(function($value, Validation $object){$object->error('some_field', 'some_error');}, array(':value', ':validation')),),);}
绑定值
ORM 会自动调用 Validation::bind() 绑定 下面的值 原文:
自动校验
当模型的方法 ORM::save(), ORM::update(), 或 ORM::create() 被调用的时候 , 该模型会自动校验现有的数据. 所以应该提防这些方法因执行数据校验不符合 而 抛出一个 [ORM_Validation_Exception] 异常 原文.
public function action_create(){try{$user = ORM::factory('user');$user->username = 'invalid username';$user->save();}catch (ORM_Validation_Exception $e){$errors = $e->errors();}}
处理校验异常
通过 [ORM_Validation_Exception] 异常可以访问到 试图保存一个模型的信息时遇到的 校验错误信息. ORM_Validation_Exception::errors() 方法的工作机制 和 Validation::errors() 非常相似. 不传递参数将会返回校验失败的规则名. 但是和 Validate::errors() 不同的是 ORM_Validation_Exception::errors() 方法的第一个参数是一个路径. 该模型的 ORM::$_object_name 将追加到该目录 , 用来形成由 Validation::errors() 产生的错误 的消息文件. 第二个参数 和 Validation::errors() 方法 的参数 相同的 原文.
在下面的例子里, 这个错误信息将会被保存在 application/messages/models/user.php 文件中 原文.
public function action_create(){try{$user = ORM::factory('user');$user->username = 'invalid username';$user->save();}catch (ORM_Validation_Exception $e){$errors = $e->errors('models');}}
外部校验
如果某些信息不应由模型来校验的话,可以放在控制器里面做。诸如 防止跨站请求伪造 CSRF的令牌校验,密码核实,或者验证码 这些信息的校验都不应该由 模型 来做。然而,为了使用户能得到很好的使用体验 所做的多处校验和整合错误信息时非常单调乏味的。因此 [ORMValidation_Exception] 内建支持 自动 处理多个 校验对象 和 自动命名校验信息数组。 ORM::save(), ORM::update(), 和 ORM::create() 都提供一个伴随模型对象的 可选的 校验对象类型的 第一参数。[尼玛这段好纠结有木有 ><](# ‘Certain forms contain information that should not be validated by the model, but by the controller. Information such as a CSRF token, password verification, or a CAPTCHA should never be validated by a model. However, validating information in multiple places and combining the errors to provide the user with a good experience is often quite tedius. For this reason, the [ORM_Validation_Exception] is built to handle multiple Validation objects and namespaces the array of errors automatically for you. ORM::save(), ORM::update(), and ORM::create() all take an optional first parameter which is a [Validation] object to validate along with the model.’).
public function action_create(){try{$user = ORM::factory('user');$user->username = $_POST['username'];$user->password = $_POST['password'];$extra_rules = Validation::factory($_POST)->rule('password_confirm', 'matches', array(':validation', ':field', 'password'));// 添加不在模型内的额外 校验规则$user->save($extra_rules);}catch (ORM_Validation_Exception $e){$errors = $e->errors('models');}}
因为 校验对象 已经被作为一个 参数 传递给了 模型 ,所有在 校验检查中所发现的错误 都被重新命名到了一个子数组中 键值 是 _external。这个返回错误的数组大概是酱紫:原文
array('username' => 'This field cannot be empty.','_external' => array('password_confirm' => 'The values you entered in the password fields did not match.',),);
这样做就保证了多个 校验对象 和 模型的 校验错误信息不会相互覆盖。原文
[!!] [ORM_Validation_Exception] 也可以通过不同的方式用来合并从相关模型返回的错误 ,来瞅瞅 一些牛X的 用例吧。原文
[这章翻译的挺烂。。]
