2018-12-19 22:51:11 2238次浏览 4条回答 0 悬赏 10 金钱

比如我在父级模型 Operationrules 里面定义了一个 name 为 required 属性,可是我子级模型 Flink 继承了这个 rules,可是我这个子级的 name 不是必填项,我已经在 beforeSave 里面设置了它的值了,可是他还是提示空值,应该是没有在表单里面填写,那么要怎么不重写 rules,而是通过继承的方法,把name 的这个 required 去掉,好像没有 unrequired 这个属性。这个要怎么处理?

  • 回答于 2018-12-20 06:59 举报

    重写rules方法不就行了啊

    public function rules()
    {
        取父级rules;
        去掉required那一项;
        return 剩下的;
    }
    
    4 条回复
    回复于 2018-12-20 09:05 回复

    就是不想重写呀,想用继承的方法,因为父级很多字段,在这个子级都是共用,重写感觉代码很冗余,如果是重写,这个我还是会的。我就是不知道怎么在子级中通过继承的方法,冲掉父级的那个required。

    回复于 2018-12-20 17:20 回复

    我写的不就是继承吗? 没仔细看吗?

    回复于 2018-12-22 16:45 回复

    我看到你开头就写着重写rules方法,因为我不想重写,所以下面就没仔细看了。

    回复于 2018-12-22 20:53 回复

    覆盖和重写都是继承的一种方式

  • 回答于 2018-12-20 09:20 举报

    如果用场景呢

  • 回答于 2018-12-20 09:48 举报

    自己堵自己的路嘛你这是。
    继承就是原封不动的拿来,子类不写 rules 方法。
    所以 rules 是啥还是啥,继承多少代都是如此,规则永不变!name 就是 required
    纯继承想解决问题,是一定不行的。所以,你想“不重写 rules,而是通过继承的方法“之外,还需要其它方面做些改动,那就是:
    必须在规则验证前赋值 name,让它符合 required 规则就行,这个思路你看可以吗?
    那么如何在之前赋值呢?先说说你的 beforeSave() 吧:
    你把子类的name在 beforeSave 里赋值,这个是可以的。但是,时机不对。因为 validate()是在 beforeSave() 之前验证的,那时子类的 name 还是为空哦。
    那咋办?
    换时机啊,在 beforeValidate() 不就可以了嘛。
    Yii2 的 AR 模型体系里,从赋值到入库留了好多事件,这些事件就是你注入自定义代码的机会。
    看看哪个是你可以用的。

  • 回答于 2018-12-20 16:14 举报

    你可以合并父类的数组

您需要登录后才可以回答。登录 | 立即注册
clao
见习主管

clao

注册时间:2018-08-03
最后登录:2022-01-25
在线时长:9小时19分
  • 粉丝1
  • 金钱80
  • 威望20
  • 积分370

热门问题