请教 Yii2 框架 afterSave 的推荐使用方式

2018-10-31 09:54:49 +08:00
 894021573
a();
b();
c();
a.save()
a 里面有一个执行 b.save()的 afterSave()
b 里面有一个执行 c.save()的  afterSave()
3383 次点击
所在节点    PHP
3 条回复
ch3nz
2018-10-31 10:44:53 +08:00
aftersave 里面不要放业务逻辑,代码多了或者人不靠谱了,调试起来会很费劲。基本上用调用来发个消息啊更新个缓存啊之类的失败也没太大关系的那种逻辑。
既然三个方法是有顺序且相关联的,那就放到一个事务里面就好

```
beginTransaction
try
a()
b()
c()
commit
catch
rollback
```
898601566
2018-10-31 11:10:55 +08:00
楼上说的对,多个数据表操作放在事务里面比较合适
hbhe
2019-09-10 09:14:54 +08:00
这个问题很好,我也一直在思考,一般情况下,我会选第 2 种。
1. 如果 a.save()的时候,必然导致 b.save(),那么就说明这段逻辑关系是固定的,放在 afterSave()中可以被更多的地方复用。
2. 采用 2 时, 在 a.save()时,b,c 会依次 save()或者说依次向上冒泡,向上冒泡的过程要避免再次执行上级的 save(),以免形成递归震荡, 可使用 updateAttributes()来避免。冒泡一般是从底往上冒,什么是底? 一对多时,多的那方的 model 是底,一对一时视业务而定。
3. 一层只管一层,如 a 只管 b, b 只管 c;
4. Model 负责逻辑中心; 而 afterSave()是中心中的中心,应高度重视。后半句个人之见。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/502873

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX