覆盖Yii中的重复验证规则

8qgya5xd  于 2022-11-09  发布在  其他
关注(0)|答案(3)|浏览(172)

请我有一些规则函数,我不想改变其代码(从数据库的基础模型),我使其他规则函数的模型,我想改变它
基本原则是“不想改变”

public function rules() {
        return array(
            array('start_date, end_date, info, type_id', 'required'),

            array('start_date, end_date, type_id', 'length', 'max'=>10),

    }

我想改变模型中继承自基本模型的其他函数,这里是它的代码

public function rules()
    {
        $rules = array(
                    array('start_date, end_date, type_id', 'length', 'max'=>16),
        );
        return array_merge($rules,parent::rules());

    }

问题是它使用的最大值为10,而不是16,我想它16,即使当我改变最后一行

return array_merge(parent::rules(),$rules);
aoyhnmkz

aoyhnmkz1#

它可能不起作用的原因是'max'=>10的规则仍然存在于rules()中,而不管顺序如何。替换规则对我来说是有效的。

public function rules(){
    $rules=parent::rules();
    $rules[1]=array('start_date, end_date, type_id', 'length', 'max'=>16);
    return $rules;
}

编辑

要替换使用'start_date, end_date, type_id'作为“键”的规则,您需要一个递归的array search

public function rules(){
    $rules=parent::rules();
    $index=0;//index of the rule
    outer: foreach($rules as $rule){
        if(array_search('start_date, end_date, type_id',$rule)!==false)
             break outer;
        $index++;
    }
    $rules[$index]=array('start_date, end_date, type_id', 'length', 'max'=>16);
    return $rules;
}

这会检查现有的规则,如果不存在,则将规则添加为$rules的最后一个元素。如果有人编辑基类中的第一个元素,例如向规则添加新的属性/字段,则此操作无效。

nbysray5

nbysray52#

刚才完成了同样的任务,创建了一个合并helper函数:

public function mergeRules($parent, $rules)
{
    // creating curent rules map
    $rulesMap = [];
    foreach ($rules as $rule) {
        $validator = $rule[1];
        $attributes = array_map('trim', explode(',', $rule[0]));
        if (!isset($rulesMap[$validator])) {
            $rulesMap[$validator] = [];
        }
        $rulesMap[$validator] = CMap::mergeArray($rulesMap[$validator], $attributes);
    }

    // checking for attributes in parent rules against created rule map
    if (!empty($rulesMap)) {
        foreach ($parent as $i => $rule) {
            $validator = $rule[1];
            if (empty($rulesMap[$validator])) {
                continue;
            }
            $attributes = array_map('trim', explode(',', $rule[0]));
            foreach ($attributes as $k => $attribute) {
                if (in_array($attribute, $rulesMap[$validator])) {
                    unset($attributes[$k]);
                }
            }
            // unset if we got inherited rule of same validator
            if (empty($attributes)) {
                unset($parent[$i]);
            } else {
                $parent[$i][0] = implode(', ', $attributes);
            }
        }
    }

    return array_merge($parent, $rules);
}

然后在rules()函数中调用:

public function rules()
{
    // NOTE: you should only define rules for those attributes that
    // will receive user inputs.

    $rules = array(
        blablabla...
    );

    return $this->mergeRules(parent::rules(), $rules);

}
wydwbb8l

wydwbb8l3#

一种方法是给予规则一个键。
docs

Note: It is handy to give names to rules i.e.

public function rules()
{
    return [
        // ...
        'password' => [['password'], 'string', 'max' => 60],
    ];
}

You can use it in a child model:

public function rules()
{
    $rules = parent::rules();
    unset($rules['password']);
    return $rules;
}

在您的情况下,您可以在父类中执行此操作:-

public function rules() {
        return array(
            'requiredArray' => array('start_date, end_date, info, type_id', 'required'),

            'maxLengthArray' => array('start_date, end_date, type_id', 'length', 'max'=>10),

    }

在您的孩子班级中:-

public function rules()
{
    $parent = parent::rules();
    $rules = array(
        'maxLengthArray' => array('start_date, end_date, type_id', 'length', 'max'=>16)
    );
    unset($parent['maxLengthArray']);

    return array_merge($parent,$rules);

}

编辑:
请记住,如果您只想更新'maxLengthArray'中的'一个'属性...则必须在从父级'unset'之后重新应用其他属性(显然:))。
例如:-仅更改type_id长度...子项将如下所示:-

public function rules()
{
    $parent = parent::rules();
    $rules = array(
        'maxLengthArray' => array('start_date, end_date', 'length', 'max'=>10),
        'typeIdLength' => array('type_id', 'length', 'max'=>16),

    );
    unset($parent['maxLengthArray']);

    return array_merge($parent,$rules);

}

相关问题