CakePHP中的数据验证行为意外

时间:2014-03-20 13:39:35

标签: validation cakephp cakephp-1.3

在我的控制器中,我正在尝试验证用户发送的一些数据,但奇怪的是,即使一切看起来都是正确的,验证也会失败:

if(isset($this->data['Cart'])) { //See below for what is in $this->data!!
    $this->Cart->set($this->data);
    if($this->Cart->validates()) {

这正是你应该如何在CakePHP v1.3中做到的(见http://book.cakephp.org/1.3/en/The-Manual/Common-Tasks-With-CakePHP/Data-Validation.html

模特:

class Cart extends AppModel
{
    var $useTable = false;

    var $validate = array(
        'name' => array(
            'rule' => 'notEmpty',
            'required' => true,
            'message' => 'Geben Sie Ihren Namen ein!'
        ),
        'address' => array(
            'rule' => 'notEmpty',
            'required' => true,
            'message' => 'Geben Sie Straße und Hausnummer ein!'
        ),
        'city' => array(
            'rule' => 'notEmpty',
            'required' => true,
            'message' => 'Geben Sie Postleitzahl und Ort ein!'
        ),
        'email' => array(
            'rule' => 'notEmpty',
            'required' => true,
            'message' => 'Geben Sie Ihre E-Mail-Adresse ein!'
        )
    );
}

var_dump($this->data)的结果:

array(2) {
  ["amount"]=>
  array(2) {
    ["san02l"]=>
    string(1) "5"
    ["pp02l"]=>
    string(1) "1"
  }
  ["Cart"]=>
  array(7) {
    ["company"]=>
    string(13) "SomeCompany"
    ["name"]=>
    string(10) "Lars Ebert"
    ["address"]=>
    string(17) "Street No"
    ["city"]=>
    string(18) "12345 Somewhere"
    ["phone"]=>
    string(10) "0123456789"
    ["email"]=>
    string(22) "mail@example.com"
    ["comments"]=>
    string(26) "Dies ist
nur 
Ein Test!!"
  }
}

每次都会显示所有四条错误消息。我习惯了CakePHP v2,所以也许我忽略了一些非常明显的东西?为什么不验证?

更新

我也按照天行者的建议尝试了$this->Cart->set($this->data['Cart']);$this->Cart->set(array('Cart' => $this->data['Cart']));。仍然显示所有四个错误。

同样奇怪:尝试$this->Cart->validates(array('fieldList' => array('name')))时,会显示所有四个错误。在这种情况下不应该只显示一个错误吗?

问题似乎独立于$this->data。我刚尝试手动设置名称:

if(isset($this->data['Cart'])) {
    $this->Cart->set($this->data['Cart']);
    $this->Cart->set('name', 'Lars Ebert');
    if($this->Cart->validates()) {

这仍会导致显示所有错误消息。至少名称错误不应该消失吗?

2 个答案:

答案 0 :(得分:0)

不知何故,CakePHP版本似乎与notEmpty规则有问题。我改变了我的模型,现在它起作用了:

    var $validate = array(
        'name' => array(
            'rule' => array('minLength', 1),
            'required' => true,
            'allowEmpty' => false,
            'message' => 'Geben Sie Ihren Namen ein!'
        ),
        'address' => array(
            'rule' => array('minLength', 1),
            'required' => true,
            'allowEmpty' => false,
            'message' => 'Geben Sie Straße und Hausnummer ein!'
        ),
        'city' => array(
            'rule' => array('minLength', 1),
            'required' => true,
            'allowEmpty' => false,
            'message' => 'Geben Sie Postleitzahl und Ort ein!'
        ),
        'email' => array(
            'rule' => array('minLength', 1),
            'required' => true,
            'allowEmpty' => false,
            'message' => 'Geben Sie Ihre E-Mail-Adresse ein!'
        )
    );

答案 1 :(得分:-1)

也许你应该设置$ this-> data ['Cart']进行验证?您可以检查您的验证错误,如:

debug($this->Cart->validationErrors);

并且您希望保存数据您可以使用以下方式执行此操作:

// ...
            if($this->Cart->save($this->request->data['Cart'])){
                // ...
            }else{
                debug($this->Cart->validationErrors); die();
                // ...
            }

CakePhp默认设置validate => true选项进行保存。

<强>更新 你也可以:

  1. 将table设置为true并尝试保存数据而不进行验证(然后是你 将知道您是否验证错误或您的数据表单错误或将表设置为false错误)
  2. 检查表格是开放形式并且形式关闭,检查您的姓名 输入
  3. 尝试仅使用一个规则测试数据,或尝试其他规则
  4. 检查你的模型命名,试试debug($ this-&gt; model);它是否正确地设定了一切
  5. 尝试使用型号名称验证数据,例如:

        $this_data['Cart'] = $this->data['Cart'];
        $this->Cart->set($this_data);
        if ($this->Cart->validates()){
            // ...
        } else{
            debug($this->Cart->invalidFields()); die();
        }
    
  6. 'allowEmpty' => false设置为您的模型规则,例如:

  7. _

     var $validate = array(
             'yourFieldName' => array(
                'rule' =>  'notEmpty',
                'required' => true,
                'allowEmpty' => false,
                'message' => '...'
                )
              );