不少伙伴对yii2的事件和行为比较蒙,经过这节你会发现,其实没你想象中的复杂。php
在学习本篇以前,建议先复习如下内容,将对本次学习有帮助。html
仍是老规矩,本篇咱们学习如何使用,下一篇研究它的运行原理。数据库
咱们仍是使用前几篇的例子yii2
namespace app\components; use yii\base\Behavior; class HelloBehavior extends Behavior { }
仍是行为 HelloBehavior,我如今想作一件事情,将这个行为绑定到User模型(一个AR,管理数据库的user表)上,凡是新建会员的时候,都在其username加一个“+”号。app
首先说这个事情的实现由不少种途径,咱们用行为来作。yii
每次新建会员的时候,我天然想到了AR有一个内置的事件叫作 ActiveRecord::EVENT_BEFORE_INSERT ,那就用它来作。函数
你不知道这个事件?omg ,赶忙去看看速查表 传送门学习
我知道 Behavior 行为类有一个叫作 events函数用来返回全部相关事件,那么开始改造this
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的时候,则在后面加上“+”。spa
到此为止你看到了,咱们试图改变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类进行任何的修改。
看看结果。
就这样完成了。
我知道此刻你必定有不少疑问,好比
别急,咱们先用这个例子开始,接下来的几篇将为你解决上面的这些疑问,一件一件抛开她。