我有一个扩展的基础模型。其中,我定义了两个验证过滤器。一个检查记录是否是唯一的,另一个检查记录是否存在。他们以完全相同的方式工作,除了返回值与其他值相反。锂:如何从另一个内部调用一个验证过滤器
因此,编写两次相同的代码只返回不同的值听起来不太合适。 我想知道如何从另一个调用一个自定义验证器。
这里是我的unique
验证码:
<?php
Validator::add('unique', function($value, $rule, $options) {
$model = $options['model'];
$primary = $model::meta('key');
foreach ($options['conditions'] as $field => $check) {
if (!is_numeric($field)) {
if (is_array($check)) {
/**
* array(
* 'exists',
* 'message' => 'You are too old.',
* 'conditions' => array(
*
* 'Users.age' => array('>' => '18')
* )
*)
*/
$conditions[$field] = $check;
}
} else {
/**
* Regular lithium conditions array:
* array(
* 'exists',
* 'message' => 'This email already exists.',
* 'conditions' => array(
* 'Users.email' //no key ($field) defined
* )
*)
*/
$conditions[$check] = $value;
}
}
/**
* Checking to see if the entity exists.
* If it exists, record exists.
* If record exists, we make sure the record is not checked
* against itself by matching with the primary key.
*/
if (isset($options['values'][$primary])) {
//primary key value exists so it's probably an update
$conditions[$primary] = array('!=' => $options['values'][$primary]);
}
$exists = $model::count($conditions);
return ($exists) ? false : true;
});
?>
exists
应该像这样工作:
<?php
Validator::add('exists', function($value, $rule, $options) {
$model = $options['model'];
return !$model::unique($value, $rule, $options);
});
?>
但很明显,它不能那么做。我是否必须将验证函数定义为匿名函数,将其分配给一个变量并将其传入而不是关闭? 或者我可以从exists
内拨打unique
吗?
谢谢@rmarscher。 我看到你缩短了回报线,傻了我,我应该这样做:) 但是你为什么要在那里设置'$ self'? – Housni 2012-04-10 21:20:56
此外,您必须将$ value传递给'unique'方法,因为它在里面需要。 – Housni 2012-04-10 21:24:07
嗯,我想我无意中复制并粘贴'$ self'设置,因为我必须在我的一些过滤器中这样做,以使当前对象在回调中可用('$ self'然后通过'使用函数定义的子句)。 我修复了'$ value'部分。但是,是的,你的方式很好的解决方案。如果我在提交之前刷新了页面,我不会发布我的。 – rmarscher 2012-04-13 01:51:37