AttributeBehavior
接下来我们来讲解yii2的第二个行为类,如果你细心观察,应该能发现上面好几个行为类都继承于此类,那么该类的使用方法是什么那?它支持在AR事件触发时自动修改它的属性。
我们假设一种场景,还是上面的那个member数据表,我们为其增加一个token字段,该字段的值被数据生成时初始化,值为username的md5值,这个事情在所有member初始化时候都会发生,现在用AttributeBehavior来搞定它。
第一步设置Member模型
还是在它的 behaviors 方法中,我们如下设置
// appmodelsMember.php
namespace appmodels;
use Yii;
use yiibehaviorsAttributeBehavior;
use yiidbActiveRecord;
class Member extends yiidbActiveRecord {
public function behaviors(){
return [
[
'class' => AttributeBehavior::className(),
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => 'token',
],
'value' => function ($event) {
return md5($this->username);
},
],
];
}
}
我们依然使用上面例子第二步的action代码,不做任何改动,看看行为对所注入类的功能增强。

SluggableBehavior
下面来说说 SluggableBehavior 这个行为类,网上很少有人讲过它,我们不落下。
使用 SluggableBehavior 可以让我们的URL美化更加语义化。
还是上面的例子,如果我们想通过url获得某一个会员的信息,一般是这样写 http://abc.com/index.php?r=me...
对吧,这样我们可以获得id=3的会员信息。
但是这样的url我们和搜索引擎都不喜欢,所以现在我们常用 http://abc.com/member/view/3 这种格式,这种格式很简单,通过url美化可以轻松实现。
但是,这也不是我们最喜欢的,都在讲url的语义化,我想下面的url才是我们想要的
http://abc.com/member/wang-hao http://abc.com/member/beijing...我数据表的username中分别对应的是 wang hao 和 beijing xiao si 的记录,这样的url不但美观,还具有很不错的安全性。
下面我来讲讲它的实现步骤,首先我需要在member表中增加一个叫做 slug 的字段。
// migrate 代码如下
$this->addColumn('member','slug',$this->string(64)->notNull());
配置模型
首先我们依然要让 SluggableBehavior 注入到Member模型中,增强其功能。
namespace appmodels;
use Yii;
use yiibehaviorsSluggableBehavior;
use yiidbActiveRecord;
class Member extends yiidbActiveRecord
{
...
public function behaviors(){
return [
[
'class' => SluggableBehavior::className(),
'attribute' => 'username',
// 'slugAttribute' => 'slug',
],
];
}
}







