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

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

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

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

仍是老规矩,本篇咱们学习如何使用,下一篇研究它的运行原理。数据库

准备

咱们仍是使用前几篇的例子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();

看看结果

alt

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

动态绑定

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

$model = new User();

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

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

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

看看结果。

alt

就这样完成了。

一些疑问

我知道此刻你必定有不少疑问,好比

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

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


相关文章
相关标签/搜索