《PHP學習:yii2學習教程之5種內置行為類詳解》要點:
本文介紹了PHP學習:yii2學習教程之5種內置行為類詳解,希望對您有用。如果有疑問,可以聯系我們。
相關主題:YII框架
PHP教程前言
PHP教程眾所周知學習所有知識都需要循序漸進,行為也是一樣,在我們學會很牛逼的新建行為,然后輕松注入到組件類之前,先看看yii2框架為我們準備的5個內置的行為類,也許你剛要用到~話不多說了,來一起看看詳細的介紹:
PHP教程本節的目的是讓各位小伙伴在使用過程中對行為有一個整體上的感覺.
PHP教程先亮亮相
PHP教程網上很多文章只是講解了其中的 TimestampBehavior ,我們把這些都講下.
PHP教程TimestampBehavior
PHP教程自動更新模型對應數據表中的創建時間(created_at)與更新時間(updated_at)字段.
PHP教程為了方便學習,我建立了一個member表,結構如下
PHP教程
PHP教程對于 created_at 和 updated_at 字段的更新,我想讓 TimestampBehavior 幫我去做,看看如何進行?
PHP教程第一步
PHP教程設置模型,在member表對應的模型Member中,我需要先進行如下設置
PHP教程
# 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'],
]
]
];
}
...
}
PHP教程從代碼上看,啟動了兩個事件,要注意的事這個事件在rules驗證之后,如果rules沒有通過,則無效.
PHP教程第二步
PHP教程接下來我們在action中使用它,為了讓例子更好玩一點,我用了控制臺模式.
PHP教程
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());
}
}
PHP教程下面看看var_dump的 $model中created_at 和 updated_at 是否有數據?
PHP教程
PHP教程對于結果我想你是喜歡的,通過增加了對行為的關聯進而為Member類增加了時間的填充功能,不單單如此,TimestampBehavior 還提供了一個有趣的touch函數,使用它能將當前時間戳賦值給指定屬性并保存到數據庫.
PHP教程可能這個方法的使用更靠近你腦海中的行為.
PHP教程
$member->touch('do_time');
PHP教程Member本身并沒有touch函數,因被 TimestampBehavior 注入而擁有了touch方法,相比較自己寫一個方法,行為可以注入到很多個類中,復用率非常高.
PHP教程AttributeBehavior
PHP教程接下來我們來講解yii2的第二個行為類,如果你細心觀察,應該能發現上面好幾個行為類都繼承于此類,那么該類的使用方法是什么那?它支持在AR事件觸發時自動修改它的屬性.
PHP教程我們假設一種場景,還是上面的那個member數據表,我們為其增加一個token字段,該字段的值被數據生成時初始化,值為username的md5值,這個事情在所有member初始化時候都會發生,現在用AttributeBehavior來搞定它.
PHP教程第一步設置Member模型
PHP教程還是在它的 behaviors 方法中,我們如下設置
PHP教程
// 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);
},
],
];
}
}
PHP教程我們依然使用上面例子第二步的action代碼,不做任何改動,看看行為對所注入類的功能增強.
PHP教程
PHP教程SluggableBehavior
PHP教程下面來說說 SluggableBehavior 這個行為類,網上很少有人講過它,我們不落下.
PHP教程使用 SluggableBehavior 可以讓我們的URL美化更加語義化.
PHP教程還是上面的例子,如果我們想通過url獲得某一個會員的信息,一般是這樣寫 http://abc.com/index.php?r=me...
PHP教程對吧,這樣我們可以獲得id=3的會員信息.
但是這樣的url我們和搜索引擎都不喜歡,所以現在我們常用 http://abc.com/member/view/3 這種格式,這種格式很簡單,通過url美化可以輕松實現.
PHP教程但是,這也不是我們最喜歡的,都在講url的語義化,我想下面的url才是我們想要的
PHP教程我數據表的username中分別對應的是 wang hao 和 beijing xiao si 的記錄,這樣的url不但美觀,還具有很不錯的安全性.
PHP教程下面我來講講它的實現步驟,首先我需要在member表中增加一個叫做 slug 的字段.
PHP教程
// migrate 代碼如下
$this->addColumn('member','slug',$this->string(64)->notNull());
PHP教程配置模型
PHP教程首先我們依然要讓 SluggableBehavior 注入到Member模型中,增強其功能.
PHP教程
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',
],
];
}
}
PHP教程要注意的是,yii2框架的slugAttribute默認為slug,而我們剛剛在數據表中增加的字段也叫slug,因此不需要再設置slugAttribute了.
PHP教程接下來我們生成一個username=wang hao的記錄,你會發現該記錄的slug自動被填充為wang-hao了
PHP教程
PHP教程Url美化
PHP教程當然到此刻,通過 http://abc.com/memberr/wang-hao 我們依然得不到,還需要UrlMananger的支持.
PHP教程
PHP教程Action的實現
PHP教程接下來我們的MemberController控制器里
PHP教程
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();
}
}
PHP教程接下來你訪問/member/wang-hao后,得到了想要的結果.
PHP教程
PHP教程這個情況在很多博客和cms站點經常用到,比如你可以訪問下月光博客看看它的url,通過 SluggableBehavior 行為幫我們省去了自己填寫slug的麻煩,自動添加.
PHP教程當然這個行為類有一個缺點就是不支持中文,如果你的字段是中文,它分析不出來,沒關系,下節我們會講解如何讓他支持中文
PHP教程關于 SluggableBehavior 還有幾個參數有必要交代一下
PHP教程
public function behaviors()
{
return [
[
'class' => SluggableBehavior::className(),
'attribute' => 'username',
'immutable' => true,
'ensureUnique'=>true,
],
];
}
PHP教程immutable 此參數默認為假,當設置為真時,一旦一個記錄被生成,以后就算更更新了 'attribute' => 'username' 字段,slug值也不會改變.
PHP教程ensureUnique 此參數默認為假,當設置為真時,可以有效避免slug的重復,如果兩個username都叫做 wang hao,則生成的slug會是wang-hao 和 wang-hao-2
PHP教程
PHP教程其他兩個
PHP教程還剩下 BlameableBehavior 和 AttributeTypecastBehavior 兩個行為,其實說到這里你應該能感覺到,yii2的內置行為主要是對AR模型屬性的增強,畢竟這是我們最常用的.
PHP教程通過上面三個行為的學習,我想你可以很輕松的搞定這兩個,代碼方面我不再講解,說說這兩個行為的作用.
PHP教程BlameableBehavior
PHP教程該行為主要是為一個ar對應數據表自動填充當前登錄會員ID
PHP教程
public function behaviors() {
return [
[
'class' => BlameableBehavior::className(),
'createdByAttribute' => 'author_id',
'updatedByAttribute' => 'updater_id',
],
];
}
PHP教程如果是后臺等模塊,你可以設置value字段來完成對登錄ID的獲取.
PHP教程AttributeTypecastBehavior
PHP教程AttributeTypecastBehavior 行為是yii2在v2.0.10版本時增加的,主要提供了一個自動轉換模型屬性格式的行為,這針對于類似MongoDB或Redis等無模式的數據庫來說是非常有用的.
PHP教程目前該行為提供的類型如下
PHP教程
const TYPE_INTEGER = 'integer';
const TYPE_FLOAT = 'float';
const TYPE_BOOLEAN = 'boolean';
const TYPE_STRING = 'string';
PHP教程當然它也提供了一個 手動方法 typecastAttributes,你可直接調用進行屬性格式的轉換.
PHP教程最后
PHP教程以上就是yii2提供的5個內置的行為類,通過這些行為(主要是前3個)可以幫我們減少很多代碼的編寫.
PHP教程當然后續的章節你將慢慢體會到行為的更多給力之處,一起期待.
PHP教程以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對維易PHP的支持.
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/383.html