提醒:本文最后更新于 2021-09-26 18:32,文中所关联的信息可能已发生改变,请知悉!
学习所有知识都需要循序渐进,行为也是一样,在我们学会很牛逼的新建行为,然后轻松注入到组件类之前,先看看 yii2 框架为我们准备的 5 个内置的行为类,也许你刚要用到~
本节的目的是让各位小伙伴在使用过程中对行为有一个整体上的感觉。
先亮亮相
- TimestampBehavior
- SluggableBehavior
- BlameableBehavior
- AttributeTypecastBehavior
- AttributeBehavior
网上很多文章只是讲解了其中的 TimestampBehavior,我们把这些都讲下。
自动更新模型对应数据表中的创建时间 (created_at) 与更新时间 (updated_at) 字段。
为了方便学习,我建立了一个 member 表,结构如下
对于 created_at 和 updated_at 字段的更新,我想让 TimestampBehavior 帮我去做,看看如何进行?
第一步
设置模型,在 member 表对应的模型 Member 中,我需要先进行如下设置
从代码上看,启动了两个事件,要注意的事这个事件在 rules 验证之后,如果 rules 没有通过,则无效。
第二步
接下来我们在 action 中使用它,为了让例子更好玩一点,我用了控制台模式。
下面看看 var_dump 的 $model 中 created_at 和 updated_at 是否有数据?
对于结果我想你是喜欢的,通过增加了对行为的关联进而为 Member 类增加了时间的填充功能,不单单如此,TimestampBehavior 还提供了一个有趣的 touch 函数,使用它能将当前时间戳赋值给指定属性并保存到数据库。
可能这个方法的使用更靠近你脑海中的行为。
Member 本身并没有 touch 函数,因被 TimestampBehavior 注入而拥有了 touch 方法,相比较自己写一个方法,行为可以注入到很多个类中,复用率非常高。
接下来我们来讲解 yii2 的第二个行为类,如果你细心观察,应该能发现上面好几个行为类都继承于此类,那么该类的使用方法是什么那?它支持在 AR 事件触发时自动修改它的属性。
我们假设一种场景,还是上面的那个 member 数据表,我们为其增加一个 token 字段,该字段的值被数据生成时初始化,值为 username 的 md5 值,这个事情在所有 member 初始化时候都会发生,现在用 AttributeBehavior 来搞定它。
第一步设置 Member 模型
还是在它的 behaviors 方法中,我们如下设置
我们依然使用上面例子第二步的 action 代码,不做任何改动,看看行为对所注入类的功能增强。
下面来说说 SluggableBehavior 这个行为类,网上很少有人讲过它,我们不落下。
使用 SluggableBehavior 可以让我们的 URL 美化更加语义化。
还是上面的例子,如果我们想通过 url 获得某一个会员的信息,一般是这样写 http://abc.com/index.php?r=member/view&id=3
对吧,这样我们可以获得 id= 3 的会员信息。
但是这样的 url 我们和搜索引擎都不喜欢,所以现在我们常用 http://abc.com/member/view/3 这种格式,这种格式很简单,通过 url 美化可以轻松实现。
但是,这也不是我们最喜欢的,都在讲 url 的语义化,我想下面的 url 才是我们想要的
- http://abc.com/member/wang-hao
- http://abc.com/member/beijing-xiao-si
我数据表的 username 中分别对应的是 wang hao 和 beijing xiao si 的记录,这样的 url 不但美观,还具有很不错的安全性。
下面我来讲讲它的实现步骤,首先我需要在 member 表中增加一个叫做 slug 的字段。
配置模型
首先我们依然要让 SluggableBehavior 注入到 Member 模型中,增强其功能。
要注意的是,yii2 框架的 slugAttribute 默认为 slug,而我们刚刚在数据表中增加的字段也叫 slug,因此不需要再设置 slugAttribute 了。
接下来我们生成一个 username=wang hao 的记录,你会发现该记录的 slug 自动被填充为 wang-hao 了
Url 美化
当然到此刻,通过 http://abc.com/memberr/wang-hao 我们依然得不到,还需要 UrlMananger 的支持。
Action 的实现
接下来我们的 MemberController 控制器里
接下来你访问 /member/wang-hao 后,得到了想要的结果。
这个情况在很多博客和 cms 站点经常用到,比如你可以访问下 月光博客 看看它的 url,通过 SluggableBehavior 行为帮我们省去了自己填写 slug 的麻烦,自动添加。
当然这个行为类有一个缺点就是不支持中文,如果你的字段是中文,它分析不出来,没关系,下节我们会讲解如何让他支持中文
关于 SluggableBehavior 还有几个参数有必要交代一下
immutable 此参数默认为假,当设置为真时,一旦一个记录被生成,以后就算更更新了 'attribute'=> 'username' 字段,slug 值也不会改变。
ensureUnique 此参数默认为假,当设置为真时,可以有效避免 slug 的重复,如果两个 username 都叫做 wang hao,则生成的 slug 会是 wang-hao 和 wang-hao-2
还剩下 BlameableBehavior 和 AttributeTypecastBehavior 两个行为,其实说到这里你应该能感觉到,yii2 的内置行为主要是对 AR 模型属性的增强,毕竟这是我们最常用的。
通过上面三个行为的学习,我想你可以很轻松的搞定这两个,代码方面我不再讲解,说说这两个行为的作用。
BlameableBehavior
该行为主要是为一个 ar 对应数据表自动填充当前登录会员 ID
如果是后台等模块,你可以设置 value 字段来完成对登录 ID 的获取。
AttributeTypecastBehavior
AttributeTypecastBehavior 行为是 yii2 在 v2.0.10 版本时增加的,主要提供了一个自动转换模型属性格式的行为,这针对于类似 MongoDB 或 Redis 等无模式的数据库来说是非常有用的。
目前该行为提供的类型如下
当然它也提供了一个 手动方法 typecastAttributes,你可直接调用进行属性格式的转换。
以上就是 yii2 提供的 5 个内置的行为类,通过这些行为(主要是前 3 个)可以帮我们减少很多代码的编写。