步步爲營 - 先學會yii2給咱們的5種內置行爲類

學習全部知識都須要按部就班,行爲也是同樣,在咱們學會很牛逼的新建行爲,而後輕鬆注入到組件類以前,先看看yii2框架爲咱們準備的5個內置的行爲類,也許你剛要用到~php

本節的目的是讓各位小夥伴在使用過程當中對行爲有一個總體上的感受。web

先亮亮相數據庫

  • TimestampBehavior
  • SluggableBehavior
  • BlameableBehavior
  • AttributeTypecastBehavior
  • AttributeBehavior

網上不少文章只是講解了其中的 TimestampBehavior ,咱們把這些都講下。安全

TimestampBehavior

自動更新模型對應數據表中的建立時間(created_at)與更新時間(updated_at)字段。微信

爲了方便學習,我創建了一個member表,結構以下yii2

數據表結構
數據表結構

對於 created_atupdated_at 字段的更新,我想讓 TimestampBehavior 幫我去作,看看如何進行?app

第一步

設置模型,在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沒有經過,則無效。yii

第二步

接下來咱們在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代碼,不作任何改動,看看行爲對所注入類的功能加強。

token功能被實現了
token功能被實現了

SluggableBehavior

下面來講說 SluggableBehavior 這個行爲類,網上不多有人講過它,咱們不落下。

使用 SluggableBehavior 可讓咱們的URL美化更加語義化。

仍是上面的例子,若是咱們想經過url得到某一個會員的信息,通常是這樣寫 abc.com/index.php?r…

對吧,這樣咱們能夠得到id=3的會員信息。
可是這樣的url咱們和搜索引擎都不喜歡,因此如今咱們經常使用 abc.com/member/view… 這種格式,這種格式很簡單,經過url美化能夠輕鬆實現。

可是,這也不是咱們最喜歡的,都在講url的語義化,我想下面的url纔是咱們想要的

我數據表的username中分別對應的是 wang haobeijing xiao si 的記錄,這樣的url不但美觀,還具備很不錯的安全性。

下面我來說講它的實現步驟,首先我須要在member表中增長一個叫作 slug 的字段。

// migrate 代碼以下
$this->addColumn('member','slug',$this->string(64)->notNull());複製代碼

配置模型

首先咱們依然要讓 SluggableBehavior 注入到Member模型中,加強其功能。

namespace app\models;

use Yii;
use yii\behaviors\SluggableBehavior;
use yii\db\ActiveRecord;


class Member extends \yii\db\ActiveRecord {
    ...

    public function behaviors(){
        return [
            [
                'class' => SluggableBehavior::className(),
                'attribute' => 'username',
                // 'slugAttribute' => 'slug',
            ],
        ];
    }
}複製代碼

要注意的是,yii2框架的slugAttribute默認爲slug,而咱們剛剛在數據表中增長的字段也叫slug,所以不須要再設置slugAttribute了。

接下來咱們生成一個username=wang hao的記錄,你會發現該記錄的slug自動被填充爲wang-hao了

行爲做用
行爲做用

Url美化

固然到此刻,經過 abc.com/memberr/wan… 咱們依然得不到,還須要UrlMananger的支持。

url美化
url美化

Action的實現

接下來咱們的MemberController控制器裏

namespace app\controllers;

use yii\web\Controller;
use app\models\Member;

class MemberController extends Controller{

    public function actionSlug($slug) {
        $model = Member::find()->where(['slug'=>$slug])->one();
        \yii\helpers\VarDumper::dump($model->toArray(),10,true);die();
    }
}複製代碼

接下來你訪問/member/wang-hao後,獲得了想要的結果。

結果
結果

這個狀況在不少博客和cms站點常常用到,好比你能夠訪問下月光博客看看它的url,經過 SluggableBehavior 行爲幫咱們省去了本身填寫slug的麻煩,自動添加。

固然這個行爲類有一個缺點就是不支持中文,若是你的字段是中文,它分析不出來,不要緊,下節咱們會講解如何讓他支持中文

關於 SluggableBehavior 還有幾個參數有必要交代一下

public function behaviors() {
    return [
        [
            'class' => SluggableBehavior::className(),
            'attribute' => 'username',
            'immutable' => true,
            'ensureUnique'=>true,
        ],
    ];
}複製代碼

immutable 此參數默認爲假,當設置爲真時,一旦一個記錄被生成,之後就算更更新了 'attribute' => 'username' 字段,slug值也不會改變。

ensureUnique 此參數默認爲假,當設置爲真時,能夠有效避免slug的重複,若是兩個username都叫作 wang hao,則生成的slug會是wang-hao 和 wang-hao-2

自動加-n
自動加-n

其餘兩個

還剩下 BlameableBehaviorAttributeTypecastBehavior 兩個行爲,其實說到這裏你應該能感受到,yii2的內置行爲主要是對AR模型屬性的加強,畢竟這是咱們最經常使用的。

經過上面三個行爲的學習,我想你能夠很輕鬆的搞定這兩個,代碼方面我再也不講解,說說這兩個行爲的做用。

BlameableBehavior

該行爲主要是爲一個ar對應數據表自動填充當前登陸會員ID

public function behaviors() {
     return [
         [
             'class' => BlameableBehavior::className(),
             'createdByAttribute' => 'author_id',
             'updatedByAttribute' => 'updater_id',
         ],
     ];
 }複製代碼

若是是後臺等模塊,你能夠設置value字段來完成對登陸ID的獲取。

AttributeTypecastBehavior

AttributeTypecastBehavior 行爲是yii2在v2.0.10版本時增長的,主要提供了一個自動轉換模型屬性格式的行爲,這針對於相似MongoDB或Redis等無模式的數據庫來講是很是有用的。

目前該行爲提供的類型以下

const TYPE_INTEGER = 'integer';
const TYPE_FLOAT = 'float';
const TYPE_BOOLEAN = 'boolean';
const TYPE_STRING = 'string';複製代碼

固然它也提供了一個 手動方法 typecastAttributes,你可直接調用進行屬性格式的轉換。

最後

以上就是yii2提供的5個內置的行爲類,經過這些行爲(主要是前3個)能夠幫咱們減小不少代碼的編寫。

固然後續的章節你將慢慢體會到行爲的更多給力之處,一塊兒期待。喜歡的點個贊哈。


本文原創發佈於微信公衆號 北哥兄弟連

微信掃碼能夠關注
微信掃碼能夠關注
相關文章
相關標籤/搜索