我的网络客户端的注册表单和相同注册表单的API。我想通过使用与模型中的Web客户端相同的规则来验证API中的数据,但我需要显示不同的消息。在Web客户端中,我有“'字段名称中的错误”等消息,对于API,我需要消息“1”。现在我用控制器中的if语句执行此操作,如果错误是“字段名称错误”,则给我消息“1”。问题是,如果我必须验证10个字段,我需要在控制器中写入10个if语句。有没有更聪明的方法呢?
型号:
class User extends AppModel {
public $validate = array(
'name'=>array(
'rule'=>'notEmpty',
'message'=> ‘Error in field Name’
)
);
}
控制器
class RestUsersController extends AppController {
$errors = $this->User->invalidFields();
if(array_shift(array_slice($errors, 0, 1))== ' Error in field Name '){
$message='1';
}
}
提前谢谢!
答案 0 :(得分:1)
您可以在模型的beforeValidation()
回调中设置验证规则。在这个方法中,您可以准备两个验证集数组,并在AppModel中放置一个变量,它将像switch一样工作,以选择适当的验证集。您需要使其正常工作的是在beforeFilter()
回调中为您的API控制器中的此开关设置正确的值。为了更好地理解我的解决方案,请查看下面的代码示例。
<强>模型强>
class User extends AppModel {
public function beforeValidate($options = array()) {
parent::beforeValidate($options);
$this->_prepareValidationRules();
}
protected function _prepareValidationRules() {
if (!empty($this->apiValidation)) { // for API
$this->validate = array(
'name' => array(
'rule' => 'notEmpty',
'message' => 'Error in field Name'
));
} else { // default behaviour
$this->validate = array(
'name' => array(
'rule' => 'notEmpty',
'message' => '1'
));
}
}
}
<强>控制器强>
class RestUsersController extends AppController {
public function beforeFilter() {
parent::beforeFilter();
$this->User->apiValidation = true;
}
}
<强> AppModel.php 强>
class AppModel extends Model {
public $apiValidation = false;
(...)
}
当然,您可以将$apiValidation
变量定义为protected并通过方法控制它,但这取决于您。