0

我正在尝试用 CakePHP2 编写我的第一个项目(我之前使用过 CakePHP1),但我遇到了以下问题。

我有几个模型需要一个字段的自定义验证规则(个人数字代码)。验证规则非常大,所以我不想在每个模型中重复代码。

相反,我考虑编写一个带有函数的组件,该函数将接收一个字符串作为参数并对其进行验证,然后从每个模型中调用该特定函数。

我读到组件应该在控制器中使用,所以也许这不是最好的方法?

我正在尝试做的实际上是扩展 ModelValidator 并添加我自己的自定义规则,但我不知道这是否可能。

谢谢你的帮助。

4

2 回答 2

0

不,组件不适用于模型。我为我的自定义验证规则所做的是向 AppModel 添加方法。然后,您可以在模型的任何验证数组中使用它们。

如果您还不知道如何使用它们,请参阅有关制作自定义验证方法的 Cake book 部分:

http://book.cakephp.org/2.0/en/models/data-validation.html#adding-your-own-validation-methods

但是,不要将方法放入您需要的每个模型中,而是将其放入您的 AppModel 中(如果您没有 AppModel 类,请创建如下所示的类并将其保存到app/Model/AppModel.php。您的所有模型都将继承此类,所以您的自定义验证方法将可用于任何模型。)

这是一个简单的例子:

/**
 * app/Model/AppModel.php
 */
class AppModel extends Model {

    /**
     * Validation rule for integers
     *
     * @param  mixed $value
     * @return bool
     */
    public function validateInteger($value) {
        return preg_match('/^\d+$/', array_shift($value));
    }

}

/**
 * app/Model/MyModel.php
 */
class MyModel extends AppModel {

    /**
     * Validation
     *
     * @var array
     */
    public $validate = array(
        'my_field' => array(
            'rule' => 'validateInteger',
            'message' => 'This field only accepts integers'
        )
    );

}

我还玩弄了一个自定义验证行为的想法,其中包含所有这些验证方法,但由于行为的限制,我发现它不是特别好,也不是那么方便。

于 2012-11-06T14:06:26.070 回答
0

我找到了自己问题的答案:行为。

CakePHP 结构建议:

  • 组件应该在控制器中使用

  • 视图中应使用助手

  • 行为应该在模型中使用

为了定义行为,我做了以下事情:

  1. 在 app/Model/Behavior/ValidateBehavior.php 文件中:

    class ValidateBehavior extends ModelBehavior {
    
        // the first param is the model object
        public function isValidCnp($Model, $data) {
    
        // data is an array that contains the field name and value
        // define validations rules here
        // return true or false
        }
    }
    
  2. 在我需要验证数据的模型 app/Model/User.php 中:

     class User extends AppModel {
    
        // link the behavior to the model
        public $actsAs = array('Validate');
    
        // define a custom validation rule that calls a function from the behavior
        public $validate = array(
           'cnp' => array(
               'custom' => array(
                  'rule' => array('isValidCnp')
               )
            ),
        );
     }
    

Behaviors 的好处是它们看起来像父类,它们还可以包含 beforeSave、beforeDelete 等的回调函数。

模型可以像自己的方法一样从 Behavior 调用函数,这意味着行为也可以在控制器中使用:

$this->User->isValidCnp()
于 2012-11-06T15:11:03.190 回答