0

例如,我有几个具有nameuid字段的模型,但有些模型没有它们。我希望所有具有这些字段的模型都使用以下规则,但是,我不想将以下代码块添加到每个模型中。

public $validate = array(
    'name' => array(
        array(
            'rule' => array('between', 1, 25),
            'message' => 'Name must contain %d to %d characters',
            'required' => true
        ),
        array(
            'rule' => array('custom', AppModel::REGEX_NAME),
            'message' => 'Name contains invalid characters.'
        )
    ),
    'uid' => array(
        'rule' => 'uuid',
        'message' => 'uid is not valid.',
        'required' => true
    ), 
);

我考虑过AppModel通过设置添加规则public $validate。这导致以下问题。

  1. 没有这些字段的模型总是无法通过验证,因为required它是真的。
  2. 如果你public $validate在一个模型中设置,它不会从 AppModel 继承规则。

我确信这可以通过即时添加验证来处理(我在 AppModel 中考虑 beforeValidate()),但我想知道其他人是如何处理这个问题的。

有谁知道更好的方法?

4

3 回答 3

2

就个人而言,我只会在每个模型中复制/粘贴验证数组。

如果这不是您想要做的,您可以做类似的事情 extend AppModelto MyAppModel。在 MyAppModel setpublic $validate = array(...)中,对于需要这些验证规则的模型,只需扩展MyAppModel而不是AppModel在您的类声明中。

至于问题 #2,您需要调用parent::validate以检索该数组,然后用进一步的规则对其进行补充。我最初的想法是为未找到的新规则创建一个数组,MyAppModel然后array_merge使用array + parent::validate.

于 2013-09-03T20:18:57.793 回答
1
  1. 您可以向 AppModel 添加一个类似 mergeDefaultRules() 的方法,该方法可以在每个模型中调用 beforeValidate() ,它将默认规则与模型特定规则合并
  2. 您可以使用特征而不是使用 AppModel 方法 - 如果您可以使用 php 5.4
  3. 你可以使用一个行为

我会去1或2。

// In your AppModel
public function mergeDefaultRules() {
    $this->validate = array_merge($this->validate, array(/* Default rules here */));
}
// In your specific model
public function beforeValidate($options = array()) {
    $this->mergeDefaultRules();
    return true;
}
于 2013-09-03T20:27:29.053 回答
1

这通常通过复制/粘贴验证数组或将“正常”验证规则设置到烘焙模板来处理。这样,它们在启动每个项目时默认就在那里。

或者根据上面的评论,您可以使用 Behavior - 尽管除非您有很多模型,否则我个人认为这太过分了。

于 2013-08-30T17:07:31.043 回答