CakePHP Validation 没有二维数组的模型

Posted

技术标签:

【中文标题】CakePHP Validation 没有二维数组的模型【英文标题】:CakePHP Validation no model with two dimensional array 【发布时间】:2011-08-02 09:43:05 【问题描述】:

使用 Cakephp 1.3,我如何使用内置验证来验证生成二维数组的表单,设置如下,并且只有“预订”模型。对于这个例子,假设我只需要确保它们是必需的:

[Booking] => Array
        (
            [id] => 10000141
            [terms] => 1
        )

[Member] => Array
        (
            [name] => Test Name
            [billing_address] => 1234 Park Lane
            [billing_city] => New York
            [billing_zip] => 10001
            [billing_state] => NY
            [billing_country] => US
        )

[Order] => Array
        (
            [theTotal] => 21.64
            [currencyCode] => USD
        )

[CreditCard] => Array
        (
            [card_number] => 1234567890
        )

我知道如何使用Multiple Validation Sets,但由于我没有“会员”、“订单”、“信用卡”的模型,如何验证信息?

这个表单是多维模型的原因是因为我将数据发送到 PayPal 进行处理,并且除了预订之外不保存任何信息。

【问题讨论】:

【参考方案1】:

控制器

CakePHP 将每个加载模型的validationErrors 属性传递给 View 类(然后是 FormHelper 类),因此可以显示验证错误。由于Controller::render() 方法checks that each model is loaded,从控制器真正实现这一点的唯一方法(不扩展render() 方法)是动态创建所需的模型:

public function add() 
    // ...
    $this->Member = new Model(null, false); // make fake model with no table
    $this->modelNames[] = 'Member'; // add to list of models
    // perform validation
    if (!Validation::minLength($this->data['Member']['name'], 1)) 
        $this->Member->validationErrors['name'] = 'Please enter you name';
    
    // ...

编辑

如果“蛋糕标准”是指您想使用 Model::validate 数组,这也是可能的:

public function add() 
    // ...
    $this->Member = new Model(null, false); // make fake model with no table
    $this->modelNames[] = 'Member'; // add to list of models
    // perform validation
    $this->Member->validate = array(
        'name' => array(
            array(
                'rule' => array('minLength', 5),
                'message' => 'Your full name must be at least five characters in length'
            ),
        ),
    );
    $this->Member->set($this->data);
    $this->Member->validates();

【讨论】:

谢谢。虽然我希望有一种更标准的方式将二维数组添加到模型中,但我想这是不可能的。这应该完全符合我的期望。 查看编辑以了解更多蛋糕标准方式,尽管真正的蛋糕标准方式是您试图避免的 :)【参考方案2】:

型号

您要进行的验证是Model class 的一项功能。我会亲自为上述每个创建模型,包括您的 $validates 数组,但将 $useTable 属性设置为 false 以防止它与您的数据库交互。这应该允许您在 your controllers 等位置使用模型中的功能,例如验证。

【讨论】:

@deisel 感谢您的评论,但我想问是否有办法做到这一点,而无需为每个模型创建模型。目前基本上是为了节省时间和复杂性,因为在未来,我们很可能会以不同的方式验证和保存所有这些信息,使用价格的预订模型和保存帐单地址和抄送号码的用户模型。我们已经在我们的系统中使用了 45 个模型,并且在发送到 paypal 之前添加另外 3 个模型只是为了一页验证,这并不是最好的选择。【参考方案3】:

查看

由于 CakePHP 期望在将验证错误传递给视图之前看到真实模型,因此您也可以手动执行以使事情变得更简单:

public function add() 
    // perform validation
    if (!Validation::minLength($this->data['Member']['name'], 1)) 
        $validationErrors['Member']['name'] = 'Please enter you name';
    
    // etc ...
    $this->set(compact('validationErrors')); // pass to view

在您看来,您可以手动将其设置为 FormHelper:

<?php $this->Form->validationErrors = $validationErrors; ?>

【讨论】:

完美。谢谢!在我们为表单上的所有数据实现真实模型之前,进行临时验证是一种更简单、更好的方法。 在 Cake 2 中略有不同:$validationErrors['Member']['name'][] = 'Please enter you name';(附加到数组)

以上是关于CakePHP Validation 没有二维数组的模型的主要内容,如果未能解决你的问题,请参考以下文章

Cakephp - 创建记录但没有数据的保存方法

CakePHP 验证错误未出现

CakePHP4 Ajax:从控制器发送到视图

在 CakePHP 中保存没有数据的模型(只需在 db 中创建 id)

cakephp : 使用 $validate 数组验证登录表单

CakePHP 奇怪的 saveAll 问题。返回 true,但在数据库中没有任何内容