在不同模型中使用单个自定义验证规则



我正在尝试在cakephp2中写我的第一个项目(我以前使用了cakephp1),我有以下问题。

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

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

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

我要做的是实际扩展模型效果并添加自己的自定义规则,但是我不知道是否可以。

谢谢您的帮助。

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

如果您还不知道如何使用它们:

请参阅有关制作自定义验证方法的蛋糕书部分:

http://book.cakephp.org/2.0/en/models/data-validation.html#adding-your-nour-now-walidation-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'
        )
    );
}

我还喜欢具有自定义验证行为的想法,其中包含所有这些验证方法,但由于行为的局限p>

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

CakePHP结构推荐:

  • 组件应在控制器中使用

  • 应在视图中使用帮助者

  • 在模型中应使用行为

定义我做的行为:

  1. 在应用程序/模型/行为/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. 在我的Model 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')
               )
            ),
        );
     }
    

行为的好处是,它们的作用似乎像父级,也可以包含beforesave,beforeDelete等的回调功能。

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

$this->User->isValidCnp()

相关内容

  • 没有找到相关文章

最新更新