步步为营 - 先学会yii2给咱们的5种内置行为类

学习全部知识都须要按部就班,行为也是同样,在咱们学会很牛逼的新建行为,而后轻松注入到组件类以前,先看看yii2框架为咱们准备的5个内置的行为类,也许你刚要用到~php

本节的目的是让各位小伙伴在使用过程当中对行为有一个总体上的感受。web

先亮亮相数据库

  • TimestampBehaviorsegmentfault

  • SluggableBehavior安全

  • BlameableBehavior微信

  • AttributeTypecastBehavioryii2

  • AttributeBehaviorapp

网上不少文章只是讲解了其中的 TimestampBehavior ,咱们把这些都讲下。框架

TimestampBehavior

自动更新模型对应数据表中的建立时间(created_at)与更新时间(updated_at)字段。yii

为了方便学习,我创建了一个member表,结构以下

数据表结构

对于 created_atupdated_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代码,不作任何改动,看看行为对所注入类的功能加强。

token功能被实现了

SluggableBehavior

下面来讲说 SluggableBehavior 这个行为类,网上不多有人讲过它,咱们不落下。

使用 SluggableBehavior 可让咱们的URL美化更加语义化。

仍是上面的例子,若是咱们想经过url得到某一个会员的信息,通常是这样写 http://abc.com/index.php?r=me...

对吧,这样咱们能够得到id=3的会员信息。
可是这样的url咱们和搜索引擎都不喜欢,因此如今咱们经常使用 http://abc.com/member/view/3 这种格式,这种格式很简单,经过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美化

固然到此刻,经过 http://abc.com/memberr/wang-hao 咱们依然得不到,还须要UrlMananger的支持。

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

其余两个

还剩下 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个)能够帮咱们减小不少代码的编写。

固然后续的章节你将慢慢体会到行为的更多给力之处,一块儿期待。喜欢的点个赞哈。

没完,还有一件小事

整个小广告,你们知道sf社区有讲座频道,我在7月24号会有一节专讲PHPSTORM工具的牛X功能讲解,感兴趣的去看看
https://segmentfault.com/l/15...


本文原创发布于微信公众号 北哥兄弟连

微信扫码能够关注

相关文章
相关标签/搜索