【问题标题】:How can I share validation arrays between models?如何在模型之间共享验证数组?
【发布时间】:2013-08-30 16:21:46
【问题描述】:

例如,我有几个具有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
    ), 
);

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

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

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

有人知道更好的方法吗?

【问题讨论】:

标签: php validation cakephp


【解决方案1】:

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

如果这不是您想要做的,您可以执行类似将AppModel 扩展为MyAppModel 的操作。在 MyAppModel 中设置 public $validate = array(...),对于需要这些验证规则的模型,只需在类声明中扩展 MyAppModel 而不是 AppModel

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        • 2017-09-06
        • 2019-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多