一對好基友 - 行為和事件那些事使用篇

阿北哥ya發表於2017-08-23

很多夥伴對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 :rage:,趕緊去看看速查表 傳送門

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

成功啦,我們通過行為和事件的組合影響了User類的功能,而我們並沒有改動User的業務邏輯,多好。

動態繫結

接下來給大家演示一下動態繫結,動態繫結並不需要去改動User的behaviors()函式,直接在action內進行,看下面程式碼

$model = new User();

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

$model->username = 'abei1982';
$model->save();複製程式碼

動態方法是在User物件生成後對它進行行為的繫結,此刻我們沒有對User類進行任何的修改。

看看結果。

alt
alt

就這樣完成了。

一些疑問

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

  • events是幹嘛用的?
  • 自定義的事件如何搞定?
  • 這東西到底啥原理?
  • 等等等等

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

相關文章