不少夥伴對yii2的事件和行爲比較蒙,經過這節你會發現,其實沒你想象中的複雜。php
在學習本篇以前,建議先複習如下內容,將對本次學習有幫助。html
仍是老規矩,本篇咱們學習如何使用,下一篇研究它的運行原理。數據庫
咱們仍是使用前幾篇的例子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();
看看結果
成功啦,咱們經過行爲和事件的組合影響了User類的功能,而咱們並無改動User的業務邏輯,多好。
接下來給你們演示一下動態綁定,動態綁定並不須要去改動User的behaviors()函數,直接在action內進行,看下面代碼
$model = new User(); $model->attachBehaviors([ HelloBehavior::className() ]); $model->username = 'abei1982'; $model->save();
動態方法是在User對象生成後對它進行行爲的綁定,此刻咱們沒有對User類進行任何的修改。
看看結果。
就這樣完成了。
我知道此刻你必定有不少疑問,好比
別急,咱們先用這個例子開始,接下來的幾篇將爲你解決上面的這些疑問,一件一件拋開她。