一對好基友 - 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是幹嗎用的?
  • 自定義的事件如何搞定?
  • 這東西到底啥原理?
  • 等等等等

別急,咱們先用這個例子開始,接下來的幾篇將爲你解決上面的這些疑問,一件一件拋開她。


相關文章
相關標籤/搜索