前言
眾所周知學習所有知識都需要循序漸進,行為也是一樣,在我們學會很牛逼的新建行為,然后輕松注入到組件類之前,先看看yii2框架為我們準備的5個內置的行為類,也許你剛要用到~話不多說了,來一起看看詳細的介紹:
本節的目的是讓各位小伙伴在使用過程中對行為有一個整體上的感覺。
先亮亮相
- TimestampBehavior
- SluggableBehavior
- BlameableBehavior
- AttributeTypecastBehavior
- AttributeBehavior
網上很多文章只是講解了其中的 TimestampBehavior ,我們把這些都講下。
TimestampBehavior
自動更新模型對應數據表中的創建時間(created_at)與更新時間(updated_at)字段。
為了方便學習,我建立了一個member表,結構如下
對于 created_at 和 updated_at 字段的更新,我想讓 TimestampBehavior 幫我去做,看看如何進行?
第一步
設置模型,在member表對應的模型Member中,我需要先進行如下設置
# app\models\Member namespace app\models; use Yii; use yii\behaviors\TimestampBehavior; class Member extends \yii\db\ActiveRecord { ... public function behaviors(){ return [ [ 'class'=>TimestampBehavior::className(), 'attributes'=>[ ActiveRecord::EVENT_BEFORE_INSERT => ['created_at','updated_at'], ActiveRecord::EVENT_BEFORE_UPDATE => ['created_at'], ] ] ]; } ... }
從代碼上看,啟動了兩個事件,要注意的事這個事件在rules驗證之后,如果rules沒有通過,則無效。
第二步
接下來我們在action中使用它,為了讓例子更好玩一點,我用了控制臺模式。
namespace app\commands; use yii\console\Controller; use app\models\Member; class MemberController extends Controller{ public function actionIndex(){ $model = new Member(); $model->username = 'abei'; if($model->save() == false){ var_dump($model->getErrors()); } var_dump($model->toArray()); } }
下面看看var_dump的 $model中created_at 和 updated_at 是否有數據?
對于結果我想你是喜歡的,通過增加了對行為的關聯進而為Member類增加了時間的填充功能,不單單如此,TimestampBehavior 還提供了一個有趣的touch函數,使用它能將當前時間戳賦值給指定屬性并保存到數據庫。
可能這個方法的使用更靠近你腦海中的行為。
$member->touch('do_time');
Member本身并沒有touch函數,因被 TimestampBehavior 注入而擁有了touch方法,相比較自己寫一個方法,行為可以注入到很多個類中,復用率非常高。
AttributeBehavior
接下來我們來講解yii2的第二個行為類,如果你細心觀察,應該能發現上面好幾個行為類都繼承于此類,那么該類的使用方法是什么那?它支持在AR事件觸發時自動修改它的屬性。
我們假設一種場景,還是上面的那個member數據表,我們為其增加一個token字段,該字段的值被數據生成時初始化,值為username的md5值,這個事情在所有member初始化時候都會發生,現在用AttributeBehavior來搞定它。
第一步設置Member模型
還是在它的 behaviors 方法中,我們如下設置
// app\models\Member.php namespace app\models; use Yii; use yii\behaviors\AttributeBehavior; use yii\db\ActiveRecord; class Member extends \yii\db\ActiveRecord { public function behaviors(){ return [ [ 'class' => AttributeBehavior::className(), 'attributes' => [ ActiveRecord::EVENT_BEFORE_INSERT => 'token', ], 'value' => function ($event) { return md5($this->username); }, ], ]; } }
我們依然使用上面例子第二步的action代碼,不做任何改動,看看行為對所注入類的功能增強。
SluggableBehavior
下面來說說 SluggableBehavior 這個行為類,網上很少有人講過它,我們不落下。
使用 SluggableBehavior 可以讓我們的URL美化更加語義化。
還是上面的例子,如果我們想通過url獲得某一個會員的信息,一般是這樣寫 http://abc.com/index.php?r=me...