很多夥伴對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();複製程式碼
看看結果
成功啦,我們通過行為和事件的組合影響了User類的功能,而我們並沒有改動User的業務邏輯,多好。
動態繫結
接下來給大家演示一下動態繫結,動態繫結並不需要去改動User的behaviors()函式,直接在action內進行,看下面程式碼
$model = new User();
$model->attachBehaviors([
HelloBehavior::className()
]);
$model->username = 'abei1982';
$model->save();複製程式碼
動態方法是在User物件生成後對它進行行為的繫結,此刻我們沒有對User類進行任何的修改。
看看結果。
就這樣完成了。
一些疑問
我知道此刻你一定有很多疑問,比如
- events是幹嘛用的?
- 自定義的事件如何搞定?
- 這東西到底啥原理?
- 等等等等