【问题标题】:Data validation behaving unexpected in CakePHPCakePHP 中的数据验证行为异常
【发布时间】:2014-04-27 09:40:38
【问题描述】:

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

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()) {

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

【问题讨论】:

  • 你的意思是即使你通过了正确的数据验证失败?
  • 没错,年轻的天行者!您在底部看到的数据与我传递给->set() 的数据相同。
  • 你传入的第一个数组是什么?也许这把事情搞砸了。我在想如果你只通过$this->data['Cart']也许它可以通过。
  • 不,那是 Cake v2。在 v1 中,它只有 $this->data。此外,var_dump($this->data) 显示正确的数据,var_dump($this->Cart) 显示其中的数据!
  • 您是否尝试过使用 fieldList 选项?尝试只验证一个字段?

标签: validation cakephp cakephp-1.3


【解决方案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. 将表设置为 true 并尝试在不验证的情况下保存数据(然后您 将知道您是验证错误还是您的数据表单错误或将表格设置为错误错误)
  2. 检查表格是否正确打开和关闭表格,请检查您的姓名 也输入
  3. 尝试仅使用一条规则测试数据,或尝试其他规则
  4. 检查你的模型命名,尝试调试($this->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 设置为您的模型规则,例如:

_

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

【讨论】:

  • 我不想保存数据,我只需要验证它! var_dump($this->Cart->validationErrors); 显示所有四个验证错误,它们显示在正确输入字段下的表单中。
  • 是的,我没有注意到它是蛋糕 1.3:/ - 请检查我的更新,它可能是第 5 点。
【解决方案2】:

不知何故,那个 CakePHP 版本的 notEmpty-rule 似乎有问题。我改变了我的模型,现在它可以工作了:

    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!'
        )
    );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    相关资源
    最近更新 更多