API上的Cakephp验证消息

时间:2014-09-17 13:58:36

标签: validation rest cakephp cakephp-2.0

我的网络客户端的注册表单和相同注册表单的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';
        }
   }

提前谢谢!

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并通过方法控制它,但这取决于您。