最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

yii2學習教程之5種內(nèi)置行為類詳解

 更新時間:2017年08月03日 09:25:55   作者:阿北  
這篇文章主要給大家介紹了關于yii2學習教程之5種內(nèi)置行為類的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用yii2具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧。

前言

眾所周知學習所有知識都需要循序漸進,行為也是一樣,在我們學會很牛逼的新建行為,然后輕松注入到組件類之前,先看看yii2框架為我們準備的5個內(nèi)置的行為類,也許你剛要用到~話不多說了,來一起看看詳細的介紹:

本節(jié)的目的是讓各位小伙伴在使用過程中對行為有一個整體上的感覺。

先亮亮相

  • TimestampBehavior
  • SluggableBehavior
  • BlameableBehavior
  • AttributeTypecastBehavior
  • AttributeBehavior

網(wǎng)上很多文章只是講解了其中的 TimestampBehavior ,我們把這些都講下。

TimestampBehavior

自動更新模型對應數(shù)據(jù)表中的創(chuàng)建時間(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 是否有數(shù)據(jù)?

對于結果我想你是喜歡的,通過增加了對行為的關聯(lián)進而為Member類增加了時間的填充功能,不單單如此,TimestampBehavior 還提供了一個有趣的touch函數(shù),使用它能將當前時間戳賦值給指定屬性并保存到數(shù)據(jù)庫。

可能這個方法的使用更靠近你腦海中的行為。

$member->touch('do_time');

Member本身并沒有touch函數(shù),因被 TimestampBehavior 注入而擁有了touch方法,相比較自己寫一個方法,行為可以注入到很多個類中,復用率非常高。

AttributeBehavior

接下來我們來講解yii2的第二個行為類,如果你細心觀察,應該能發(fā)現(xiàn)上面好幾個行為類都繼承于此類,那么該類的使用方法是什么那?它支持在AR事件觸發(fā)時自動修改它的屬性。

我們假設一種場景,還是上面的那個member數(shù)據(jù)表,我們?yōu)槠湓黾右粋€token字段,該字段的值被數(shù)據(jù)生成時初始化,值為username的md5值,這個事情在所有member初始化時候都會發(fā)生,現(xiàn)在用AttributeBehavior來搞定它。

第一步設置Member模型

還是在它的 behaviors 方法中,我們?nèi)缦略O置

// 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 這個行為類,網(wǎng)上很少有人講過它,我們不落下。

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

還是上面的例子,如果我們想通過url獲得某一個會員的信息,一般是這樣寫 http://abc.com/index.php?r=me...

對吧,這樣我們可以獲得id=3的會員信息。
但是這樣的url我們和搜索引擎都不喜歡,所以現(xiàn)在我們常用 http://abc.com/member/view/3 這種格式,這種格式很簡單,通過url美化可以輕松實現(xiàn)。

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

  • http://abc.com/member/wang-hao
  • http://abc.com/member/beijing...

我數(shù)據(jù)表的username中分別對應的是 wang hao 和 beijing xiao si 的記錄,這樣的url不但美觀,還具有很不錯的安全性。

下面我來講講它的實現(xiàn)步驟,首先我需要在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,而我們剛剛在數(shù)據(jù)表中增加的字段也叫slug,因此不需要再設置slugAttribute了。

接下來我們生成一個username=wang hao的記錄,你會發(fā)現(xiàn)該記錄的slug自動被填充為wang-hao了

Url美化

當然到此刻,通過 http://abc.com/memberr/wang-hao 我們依然得不到,還需要UrlMananger的支持。

Action的實現(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后,得到了想要的結果。

這個情況在很多博客和cms站點經(jīng)常用到,比如你可以訪問下月光博客看看它的url,通過 SluggableBehavior 行為幫我們省去了自己填寫slug的麻煩,自動添加。

當然這個行為類有一個缺點就是不支持中文,如果你的字段是中文,它分析不出來,沒關系,下節(jié)我們會講解如何讓他支持中文

關于 SluggableBehavior 還有幾個參數(shù)有必要交代一下

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

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

ensureUnique 此參數(shù)默認為假,當設置為真時,可以有效避免slug的重復,如果兩個username都叫做 wang hao,則生成的slug會是wang-hao 和 wang-hao-2

其他兩個

還剩下 BlameableBehavior 和 AttributeTypecastBehavior 兩個行為,其實說到這里你應該能感覺到,yii2的內(nèi)置行為主要是對AR模型屬性的增強,畢竟這是我們最常用的。

通過上面三個行為的學習,我想你可以很輕松的搞定這兩個,代碼方面我不再講解,說說這兩個行為的作用。

BlameableBehavior

該行為主要是為一個ar對應數(shù)據(jù)表自動填充當前登錄會員ID

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

如果是后臺等模塊,你可以設置value字段來完成對登錄ID的獲取。

AttributeTypecastBehavior

AttributeTypecastBehavior 行為是yii2在v2.0.10版本時增加的,主要提供了一個自動轉(zhuǎn)換模型屬性格式的行為,這針對于類似MongoDB或Redis等無模式的數(shù)據(jù)庫來說是非常有用的。

目前該行為提供的類型如下

const TYPE_INTEGER = 'integer';
const TYPE_FLOAT = 'float';
const TYPE_BOOLEAN = 'boolean';
const TYPE_STRING = 'string';

當然它也提供了一個 手動方法 typecastAttributes,你可直接調(diào)用進行屬性格式的轉(zhuǎn)換。

最后

以上就是yii2提供的5個內(nèi)置的行為類,通過這些行為(主要是前3個)可以幫我們減少很多代碼的編寫。

當然后續(xù)的章節(jié)你將慢慢體會到行為的更多給力之處,一起期待。

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • Codeigniter購物車類不能添加中文的解決方法

    Codeigniter購物車類不能添加中文的解決方法

    這篇文章主要介紹了Codeigniter購物車類不能添加中文的解決方法,涉及底層代碼中關于中文的限制問題,可通過修改正則匹配規(guī)則來解決,需要的朋友可以參考下
    2014-11-11
  • thinkPHP實現(xiàn)的省市區(qū)三級聯(lián)動功能示例

    thinkPHP實現(xiàn)的省市區(qū)三級聯(lián)動功能示例

    這篇文章主要介紹了thinkPHP實現(xiàn)的省市區(qū)三級聯(lián)動功能,詳細分析了thinkPHP實現(xiàn)省市區(qū)三級聯(lián)動功能的詳細步驟與相關操作技巧,需要的朋友可以參考下
    2017-05-05
  • PHP字符串中提取文件名的實例方法

    PHP字符串中提取文件名的實例方法

    在本篇文章里小編給大家分享的是一篇關于PHP字符串中提取文件名的實例方法,有興趣的朋友們可以跟著學習測試下。
    2021-08-08
  • php模板引擎技術簡單實現(xiàn)

    php模板引擎技術簡單實現(xiàn)

    這篇文章主要為大家詳細介紹了php模板引擎技術簡單實現(xiàn),感興趣的小伙伴們可以參考一下
    2016-03-03
  • PHP獲取頁面執(zhí)行時間的方法(推薦)

    PHP獲取頁面執(zhí)行時間的方法(推薦)

    這篇文章主要介紹了PHP獲取頁面執(zhí)行時間的方法(推薦)的相關資料,需要的朋友可以參考下
    2016-12-12
  • PHP實現(xiàn)無限分類的實現(xiàn)方法

    PHP實現(xiàn)無限分類的實現(xiàn)方法

    無限級分類是一種設計技巧,在開發(fā)中經(jīng)常使用,本篇文章主要介紹PHP實現(xiàn)無限分類的實現(xiàn)方法,有需要的可以了解一下。
    2016-11-11
  • php獲取訪問者瀏覽頁面的瀏覽器類型

    php獲取訪問者瀏覽頁面的瀏覽器類型

    最近做的項目需要根據(jù)用戶瀏覽器的類型而做一些不同的處理,于是稍微研究了一下使用php判斷瀏覽器類型的方法,下面這篇文章主要給大家介紹了php如何獲取訪問者瀏覽頁面的瀏覽器類型,需要的朋友可以參考借鑒,一起來看看吧。
    2017-01-01
  • 微信支付開發(fā)交易通知實例

    微信支付開發(fā)交易通知實例

    本文主要介紹如何使用 JS API支付時如何獲得交易通知,并提供代碼實例,希望對開發(fā)微信支付的小伙伴有所幫助
    2016-07-07
  • 微信公眾平臺開發(fā)之配置與請求

    微信公眾平臺開發(fā)之配置與請求

    微信公眾平臺是騰訊公司在微信的基礎上新增的功能模塊,通過這一平臺,個人和企業(yè)都可以打造一個微信的公眾號,并實現(xiàn)和特定群體的文字、圖片、語音的全方位溝通、互動。本文給大家介紹微信公眾平臺開發(fā)之配置與請求,需要的朋友可以參考下
    2015-08-08
  • laravel 解決crontab不執(zhí)行的問題

    laravel 解決crontab不執(zhí)行的問題

    今天小編就為大家分享一篇laravel 解決crontab不執(zhí)行的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10

最新評論

锡林浩特市| 昌乐县| 慈溪市| 宜兴市| 柯坪县| 衡南县| 武隆县| 临潭县| 乌兰浩特市| 雅安市| 宁安市| 壶关县| 绥棱县| 旺苍县| 麻城市| 阳东县| 个旧市| 凯里市| 碌曲县| 鄢陵县| 同心县| 文成县| 两当县| 开江县| 平阳县| 景谷| 龙游县| 临漳县| 应用必备| 曲周县| 惠来县| 峨山| 江西省| 永靖县| 沈阳市| 唐河县| 南江县| 林芝县| 澄江县| 土默特右旗| 安化县|