yii2學(xué)習(xí)教程之5種內(nèi)置行為類詳解
前言
眾所周知學(xué)習(xí)所有知識(shí)都需要循序漸進(jìn),行為也是一樣,在我們學(xué)會(huì)很牛逼的新建行為,然后輕松注入到組件類之前,先看看yii2框架為我們準(zhǔn)備的5個(gè)內(nèi)置的行為類,也許你剛要用到~話不多說了,來一起看看詳細(xì)的介紹:
本節(jié)的目的是讓各位小伙伴在使用過程中對(duì)行為有一個(gè)整體上的感覺。
先亮亮相
- TimestampBehavior
- SluggableBehavior
- BlameableBehavior
- AttributeTypecastBehavior
- AttributeBehavior
網(wǎng)上很多文章只是講解了其中的 TimestampBehavior ,我們把這些都講下。
TimestampBehavior
自動(dòng)更新模型對(duì)應(yīng)數(shù)據(jù)表中的創(chuàng)建時(shí)間(created_at)與更新時(shí)間(updated_at)字段。
為了方便學(xué)習(xí),我建立了一個(gè)member表,結(jié)構(gòu)如下
對(duì)于 created_at 和 updated_at 字段的更新,我想讓 TimestampBehavior 幫我去做,看看如何進(jìn)行?
第一步
設(shè)置模型,在member表對(duì)應(yīng)的模型Member中,我需要先進(jìn)行如下設(shè)置
# 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'], ] ] ]; } ... }
從代碼上看,啟動(dòng)了兩個(gè)事件,要注意的事這個(gè)事件在rules驗(yàn)證之后,如果rules沒有通過,則無效。
第二步
接下來我們?cè)赼ction中使用它,為了讓例子更好玩一點(diǎn),我用了控制臺(tái)模式。
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 是否有數(shù)據(jù)?
對(duì)于結(jié)果我想你是喜歡的,通過增加了對(duì)行為的關(guān)聯(lián)進(jìn)而為Member類增加了時(shí)間的填充功能,不單單如此,TimestampBehavior 還提供了一個(gè)有趣的touch函數(shù),使用它能將當(dāng)前時(shí)間戳賦值給指定屬性并保存到數(shù)據(jù)庫。
可能這個(gè)方法的使用更靠近你腦海中的行為。
$member->touch('do_time');
Member本身并沒有touch函數(shù),因被 TimestampBehavior 注入而擁有了touch方法,相比較自己寫一個(gè)方法,行為可以注入到很多個(gè)類中,復(fù)用率非常高。
AttributeBehavior
接下來我們來講解yii2的第二個(gè)行為類,如果你細(xì)心觀察,應(yīng)該能發(fā)現(xiàn)上面好幾個(gè)行為類都繼承于此類,那么該類的使用方法是什么那?它支持在AR事件觸發(fā)時(shí)自動(dòng)修改它的屬性。
我們假設(shè)一種場(chǎng)景,還是上面的那個(gè)member數(shù)據(jù)表,我們?yōu)槠湓黾右粋€(gè)token字段,該字段的值被數(shù)據(jù)生成時(shí)初始化,值為username的md5值,這個(gè)事情在所有member初始化時(shí)候都會(huì)發(fā)生,現(xiàn)在用AttributeBehavior來搞定它。
第一步設(shè)置Member模型
還是在它的 behaviors 方法中,我們?nèi)缦略O(shè)置
// 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代碼,不做任何改動(dòng),看看行為對(duì)所注入類的功能增強(qiáng)。
SluggableBehavior
下面來說說 SluggableBehavior 這個(gè)行為類,網(wǎng)上很少有人講過它,我們不落下。
使用 SluggableBehavior 可以讓我們的URL美化更加語義化。
還是上面的例子,如果我們想通過url獲得某一個(gè)會(huì)員的信息,一般是這樣寫 http://abc.com/index.php?r=me...
對(duì)吧,這樣我們可以獲得id=3的會(huì)員信息。
但是這樣的url我們和搜索引擎都不喜歡,所以現(xiàn)在我們常用 http://abc.com/member/view/3 這種格式,這種格式很簡單,通過url美化可以輕松實(shí)現(xiàn)。
但是,這也不是我們最喜歡的,都在講url的語義化,我想下面的url才是我們想要的
- http://abc.com/member/wang-hao
- http://abc.com/member/beijing...
我數(shù)據(jù)表的username中分別對(duì)應(yīng)的是 wang hao 和 beijing xiao si 的記錄,這樣的url不但美觀,還具有很不錯(cuò)的安全性。
下面我來講講它的實(shí)現(xiàn)步驟,首先我需要在member表中增加一個(gè)叫做 slug 的字段。
// migrate 代碼如下 $this->addColumn('member','slug',$this->string(64)->notNull());
配置模型
首先我們依然要讓 SluggableBehavior 注入到Member模型中,增強(qiáng)其功能。
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默認(rèn)為slug,而我們剛剛在數(shù)據(jù)表中增加的字段也叫slug,因此不需要再設(shè)置slugAttribute了。
接下來我們生成一個(gè)username=wang hao的記錄,你會(huì)發(fā)現(xiàn)該記錄的slug自動(dòng)被填充為wang-hao了
Url美化
當(dāng)然到此刻,通過 http://abc.com/memberr/wang-hao 我們依然得不到,還需要UrlMananger的支持。
Action的實(shí)現(xiàn)
接下來我們的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后,得到了想要的結(jié)果。
這個(gè)情況在很多博客和cms站點(diǎn)經(jīng)常用到,比如你可以訪問下月光博客看看它的url,通過 SluggableBehavior 行為幫我們省去了自己填寫slug的麻煩,自動(dòng)添加。
當(dāng)然這個(gè)行為類有一個(gè)缺點(diǎn)就是不支持中文,如果你的字段是中文,它分析不出來,沒關(guān)系,下節(jié)我們會(huì)講解如何讓他支持中文
關(guān)于 SluggableBehavior 還有幾個(gè)參數(shù)有必要交代一下
public function behaviors() { return [ [ 'class' => SluggableBehavior::className(), 'attribute' => 'username', 'immutable' => true, 'ensureUnique'=>true, ], ]; }
immutable 此參數(shù)默認(rèn)為假,當(dāng)設(shè)置為真時(shí),一旦一個(gè)記錄被生成,以后就算更更新了 'attribute' => 'username' 字段,slug值也不會(huì)改變。
ensureUnique 此參數(shù)默認(rèn)為假,當(dāng)設(shè)置為真時(shí),可以有效避免slug的重復(fù),如果兩個(gè)username都叫做 wang hao,則生成的slug會(huì)是wang-hao 和 wang-hao-2
其他兩個(gè)
還剩下 BlameableBehavior 和 AttributeTypecastBehavior 兩個(gè)行為,其實(shí)說到這里你應(yīng)該能感覺到,yii2的內(nèi)置行為主要是對(duì)AR模型屬性的增強(qiáng),畢竟這是我們最常用的。
通過上面三個(gè)行為的學(xué)習(xí),我想你可以很輕松的搞定這兩個(gè),代碼方面我不再講解,說說這兩個(gè)行為的作用。
BlameableBehavior
該行為主要是為一個(gè)ar對(duì)應(yīng)數(shù)據(jù)表自動(dòng)填充當(dāng)前登錄會(huì)員ID
public function behaviors() { return [ [ 'class' => BlameableBehavior::className(), 'createdByAttribute' => 'author_id', 'updatedByAttribute' => 'updater_id', ], ]; }
如果是后臺(tái)等模塊,你可以設(shè)置value字段來完成對(duì)登錄ID的獲取。
AttributeTypecastBehavior
AttributeTypecastBehavior 行為是yii2在v2.0.10版本時(shí)增加的,主要提供了一個(gè)自動(dòng)轉(zhuǎn)換模型屬性格式的行為,這針對(duì)于類似MongoDB或Redis等無模式的數(shù)據(jù)庫來說是非常有用的。
目前該行為提供的類型如下
const TYPE_INTEGER = 'integer'; const TYPE_FLOAT = 'float'; const TYPE_BOOLEAN = 'boolean'; const TYPE_STRING = 'string';
當(dāng)然它也提供了一個(gè) 手動(dòng)方法 typecastAttributes,你可直接調(diào)用進(jìn)行屬性格式的轉(zhuǎn)換。
最后
以上就是yii2提供的5個(gè)內(nèi)置的行為類,通過這些行為(主要是前3個(gè))可以幫我們減少很多代碼的編寫。
當(dāng)然后續(xù)的章節(jié)你將慢慢體會(huì)到行為的更多給力之處,一起期待。
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Yii框架組件和事件行為管理詳解
- Yii框架組件的事件機(jī)制原理與用法分析
- Yii2表單事件之Ajax提交實(shí)現(xiàn)方法
- 深入解析PHP的Yii框架中的event事件機(jī)制
- 詳解在PHP的Yii框架中使用行為Behaviors的方法
- 詳解PHP的Yii框架中組件行為的屬性注入和方法注入
- PHP的Yii框架中行為的定義與綁定方法講解
- yii2行為的方法如何注入到組件類中詳解
- PHP的Yii框架中移除組件所綁定的行為的方法
- YII2.0框架行為(Behavior)深入詳解
- YII框架行為behaviors用法示例
- YII2框架中behavior行為的理解與使用方法示例
- Yii Framework框架中事件和行為的區(qū)別及應(yīng)用實(shí)例分析
相關(guān)文章
PHP之認(rèn)識(shí)(二)關(guān)于Traits的用法詳解
這篇文章主要介紹了PHP Traits的用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04關(guān)于php中的json_encode()和json_decode()函數(shù)的一些說明
下面小編就為大家?guī)硪黄P(guān)于php中的json_encode()和json_decode()函數(shù)的一些說明。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11Zend Framework動(dòng)作助手Json用法實(shí)例分析
這篇文章主要介紹了Zend Framework動(dòng)作助手Json用法,結(jié)合實(shí)例形式分析了Zend Framework動(dòng)作助手Json的功能與相關(guān)使用技巧,需要的朋友可以參考下2016-03-03分享PHP-pcntl 實(shí)現(xiàn)多進(jìn)程代碼
PHP可通過PCNTL擴(kuò)展實(shí)現(xiàn)進(jìn)程控制,如進(jìn)程創(chuàng)建,信號(hào)處理,進(jìn)程中斷判斷等。但只能在CLI模式下操作。PCNTL的信號(hào)機(jī)制是基于 ticks 機(jī)制實(shí)現(xiàn)的。2016-09-09PHP網(wǎng)頁游戲?qū)W習(xí)之Xnova(ogame)源碼解讀(九)
這篇文章主要介紹了PHP網(wǎng)頁游戲Xnova(ogame)源碼解讀的艦隊(duì)相關(guān)函數(shù)部分,需要的朋友可以參考下2014-06-06php面向?qū)ο蠡A(chǔ)詳解【星際爭霸游戲案例】
這篇文章主要介紹了php面向?qū)ο蠡A(chǔ),結(jié)合星際爭霸游戲案例詳細(xì)分析了PHP面向?qū)ο箢?、繼承、重載、接口等相關(guān)概念與使用技巧,需要的朋友可以參考下2020-01-01