【问题标题】:Cakephp Validation Messages on APIAPI 上的 Cakephp 验证消息
【发布时间】:2014-09-17 13:58:36
【问题描述】:

我有一个用于我的 Web 客户端的注册表单和用于同一个注册表单的 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';
        }
   }

提前谢谢你!

【问题讨论】:

    标签: validation rest cakephp cakephp-2.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并通过方法控制它,但这取决于你。

    【讨论】:

    • 谢谢@marian0,非常适合我的情况,谢谢您的回复!
    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2011-04-29
    相关资源
    最近更新 更多