abei1982 2017-08-23 17:04:36 2580次浏览 1条回复 6 2 0

很多伙伴对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 😡,赶紧去看看速查表 传送门

我知道 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

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

动态绑定

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

$model = new User();

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

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

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

看看结果。

alt

就这样完成了。

一些疑问

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

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

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

觉得很赞
您需要登录后才可以回复。登录 | 立即注册