很多伙伴对yii2的事件和行为比较蒙,通过这节你会发现,其实没你想象中的复杂。
在学习本篇之前,建议先复习以下内容,将对本次学习有帮助。
还是老规矩,本篇我们学习如何使用,下一篇研究它的运行原理。
准备
我们还是使用前几篇的例子
namespace app\components;
use yii\base\Behavior;
class HelloBehavior extends Behavior {
}
还是行为 HelloBehavior,我现在想做一件事情,将这个行为绑定到User模型(一个AR,管理数据库的user表)上,凡是新建会员的时候,都在其username加一个“+”号。
首先说这个事情的实现由很多种途径,我们用行为来做。
每次新建会员的时候,我自然想到了AR有一个内置的事件叫做 ActiveRecord::EVENT_BEFORE_INSERT ,那就用它来做。
你不知道这个事件?omg ,赶紧去看看速查表 传送门
我知道 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();
看看结果
成功啦,我们通过行为和事件的组合影响了User类的功能,而我们并没有改动User的业务逻辑,多好。
动态绑定
接下来给大家演示一下动态绑定,动态绑定并不需要去改动User的behaviors()函数,直接在action内进行,看下面代码
$model = new User();
$model->attachBehaviors([
HelloBehavior::className()
]);
$model->username = 'abei1982';
$model->save();
动态方法是在User对象生成后对它进行行为的绑定,此刻我们没有对User类进行任何的修改。
看看结果。
就这样完成了。
一些疑问
我知道此刻你一定有很多疑问,比如
- events是干嘛用的?
- 自定义的事件如何搞定?
- 这东西到底啥原理?
- 等等等等
别急,我们先用这个例子开始,接下来的几篇将为你解决上面的这些疑问,一件一件抛开她。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。