一对好基友 - 行为和事件那些事使用篇

278 阅读2分钟

很多伙伴对yii2的事件和行为比较蒙,通过这节你会发现,其实没你想象中的复杂。

在学习本篇之前,建议先复习以下内容,将对本次学习有帮助。

  1. 步步为营 - 先学会yii2给我们的5种内置行为类
  2. yii2事件研究

还是老规矩,本篇我们学习如何使用,下一篇研究它的运行原理。

准备

我们还是使用前几篇的例子

namespace app\components;

use yii\base\Behavior;

class HelloBehavior extends Behavior {

}

还是行为 HelloBehavior,我现在想做一件事情,将这个行为绑定到User模型(一个AR,管理数据库的user表)上,凡是新建会员的时候,都在其username加一个“+”号。

首先说这个事情的实现由很多种途径,我们用行为来做。

每次新建会员的时候,我自然想到了AR有一个内置的事件叫做 ActiveRecord::EVENT_BEFORE_INSERT ,那就用它来做。

你不知道这个事件?omg :rage:,赶紧去看看速查表 传送门

我知道 Behavior 行为类有一个叫做 events函数用来返回所有相关事件,那么开始改造

namespace app\components;

use yii\base\Behavior;

class HelloBehavior extends Behavior {
    public function events(){
        return [
            ActiveRecord::EVENT_BEFORE_INSERT => 'beforeInsert',
        ];
    }

    public function beforeInsert(){
        $owner = $this->owner;
        if ($owner->getIsNewRecord()) {
            $owner->username .= '+';
        }
    }

}

改造很简单,使用events函数将行为绑定一个事件,这个事件归行为所属的组件触发,然后在行为里定义一个事件的处理函数,当新建user的时候,则在后面加上“+”。

到此为止你看到了,我们试图改变User的username的内容,但是并没有对User类进行任何改动。

开始验证

验证的方法有两种,一个是对User类静态绑定,一个是动态绑定。(不知道动静绑定可以点击 传送门

静态绑定

静态绑定我们需要对User类的behaviors() 进行配置。

public function behaviors(){
    return [
        'hello'=>[
            'class'=>HelloBehavior::className()
        ]
    ];
}

将行为HelloBehavior注入到User类中,我们修改了User的behaviors() ,有一点改动但是并不大,behaviors() 更像一个配置,我并没有改动User的业务逻辑。

接下来在某个控制器的action内写下如下代码

$model = new User();
$model->username = 'abei2017';
$model->save();

看看结果

alt
alt

成功啦,我们通过行为和事件的组合影响了User类的功能,而我们并没有改动User的业务逻辑,多好。

动态绑定

接下来给大家演示一下动态绑定,动态绑定并不需要去改动User的behaviors()函数,直接在action内进行,看下面代码

$model = new User();

$model->attachBehaviors([
    HelloBehavior::className()
]);

$model->username = 'abei1982';
$model->save();

动态方法是在User对象生成后对它进行行为的绑定,此刻我们没有对User类进行任何的修改。

看看结果。

alt
alt

就这样完成了。

一些疑问

我知道此刻你一定有很多疑问,比如

  • events是干嘛用的?
  • 自定义的事件如何搞定?
  • 这东西到底啥原理?
  • 等等等等

别急,我们先用这个例子开始,接下来的几篇将为你解决上面的这些疑问,一件一件抛开她。