2015-09-07 02:25:21 3189次浏览 1条回答 1 悬赏 100 金钱

大家好,使用yii已经一段时间了,关于行为仍然不能理解。 当然根本原因是因为php很菜,所以希望各位朋友多多指导,谢谢。

比如 yiicihna的 回帖提醒原作者的功能
假设有Controller:answerController,其中有方法actionNew
假设有model:Message

请问如何通过“行为”来实现,每次帖子有了新回复,就发信息提醒原作者呢?
深入理解Yii2.0 » Yii 基础 » 行为(Behavior) 这篇看了很久,还是不明白。只好来求助各位朋友了。如果可以请给一个实现上方需求的最简单的例子。谢谢。

  • 回答于 2015-09-07 08:50 举报

    关于“行为”,建议你参考下这篇文章先了解下Mixinhttp://www.cnblogs.com/snandy/archive/2013/05/24/3086663.html

    Yii2 里面的 behavior 其实就是 Mixin 模式的一种实践,它的主要目的在于给一个类添加另外一个类的功能,其实是多重继承的一种方式。

    开始考虑觉得你的需求不适用 Mixin 模式,但是,仔细考虑下,还是可以用 behavior 以达到解耦的目的。

    仔细考虑了下,你的需求用 behavior 实现的大致思路如下:

    假设有 Model: Message,Comment。我们实现一个SendMessageBehavior 如下:

    class SendMessageBehavior extends Behavior {
       public function events() {
          [
            BaseActiveRecord::EVENT_AFTER_INSERT => "doSend",
          ]
       }
    
       public function doSend() {
           //执行Message::send方法
           Message::send($this->owner);
       }
    }
    

    将这个behavior绑定到 Comment 上面,以处理 EVENT_AFTER_INSERT 事件。

    
    class Comment extend ActiveRecord {
        public function behaviors() {
            return [
               SendMessageBehavior::className(),
            ];
        }
    }
    

    其思路就是在有新的评论时(comment 表的 insert 事件 ),执行 message::send方法。

    2 条回复
    回复于 2015-09-07 12:00 回复

    1.请问,行为不是非常适合的话,应该从那个角度来考虑呢? 事件?
    2.看了你的例子,大概明白一点了,可是如果我需要在某个特定的update方法下绑定这个行为呢?,比如我有一个新的方法,actionUpdateName(),这时如果使用EVENT_AFTER_UPDATE这个event显然就不合适了。那会造成所有的update动作都去触发doSend方法。是需要自定义一个EVENT对吧?

    EVENT_AFTER_UPDATE_NAME = 'afterUpdateName';
    //然后  如何触发?如何处理?
    

    提得问题都是因为php基础差,十分抱歉。php手册,一直在非常方便打开的地方,现在的阶段是大概入了点门,自己尝试写点东西,然后就很多很多问题,这个阶段过去,必然把手册在好好的看几遍,这个过程遇到你,还请你多给点耐心,谢谢。

    PS,我很多问题都是你非常详细、专业回答的,很感动。真希望能做点什么。。。目前的水平也就是能出点苦力。但真心希望能做点什么。

    回复于 2015-09-08 08:42 回复

    问题1,这个只能是见仁见智了,没有绝对的适合不适合,只是从代码的扩展性,稳定性,可用性考虑。问题2,不是所有的update动作,而是特定Component/model的update动作,因为你的这个事件处理是attach在指定的model下的,所以只会处理这个model的update事件。而自定义model的Event其实没有必要,除非你在model里面手动的trigger事件。PS,只是希望你学会了以后也能够加入到传播Yii技术的大家庭中来,未来面对别人的疑惑问题也能多点耐心!:P

您需要登录后才可以回答。登录 | 立即注册
xjdata
CEO

xjdata

注册时间:2011-12-07
最后登录:2021-07-09
在线时长:112小时28分
  • 粉丝23
  • 金钱14169
  • 威望75
  • 积分16039

热门问题