十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章主要介绍yii2中内置行为类的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
站在用户的角度思考问题,与客户深入沟通,找到西双版纳网站设计与西双版纳网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站建设、成都网站设计、企业官网、英文网站、手机端网站、网站推广、域名申请、虚拟主机、企业邮箱。业务覆盖西双版纳地区。先亮亮相
TimestampBehavior
SluggableBehavior
BlameableBehavior
AttributeTypecastBehavior
AttributeBehavior
网上很多文章只是讲解了其中的 TimestampBehavior ,我们把这些都讲下。
TimestampBehavior
自动更新模型对应数据表中的创建时间(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 是否有数据?
对于结果我想你是喜欢的,通过增加了对行为的关联进而为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代码,不做任何改动,看看行为对所注入类的功能增强。
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 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的支持。
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
其他两个
还剩下 BlameableBehavior 和 AttributeTypecastBehavior 两个行为,其实说到这里你应该能感觉到,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中内置行为类的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!