序
众所周知,学习所有知识都需要循序渐进,行为也是如此。在我们学会创建新的行为并轻松地将它们注入组件类之前,我们应该先看看yii2框架准备的五个内置行为类。也许你只是想用它们~我没什么好说的,我们来看看详细的介绍:
本节的目的是让你的朋友对使用过程中的行为有一个整体的感受。
先炫耀一下
TimestampBehavior slack able behavior attributetypescastbehavior AttributeBehavior网上很多文章只解释了时间戳行为,下面就来说说。
TimestampBehavior
自动更新与模型对应的数据表中的创建时间(created_at)和更新时间(updated_at)字段。
为了方便学习,我创建了一个成员表,其结构如下
我想让TimestampBehavior帮助我更新created_at和updated_at字段,并看看如何做。
第一步
设置模型。在成员表对应的模型成员中,我需要先设置以下设置
# app models Membernamespace app models;使用Yii使用yii behavior TimestampBehavior;类成员扩展yiidbActiveRecord {.公共函数行为(){ return [' class '=timestampbehavior :3360 class name(),' attributes '=[active record : event _ BEFORE _ INSERT=[' created _ at ',' updated_at'],active record : event _ BEFORE _ UPDATE=[' created _ at '],]];从代码的角度来看,启动了两个事件。需要注意的是,如果规则验证后规则失败,则此事件无效。
第二步
接下来,我们在行动中使用它。为了让这个例子更有趣,我使用了控制台模式。
命名空间app 命令;使用yii 控制台控制器;使用应用模型成员;类MemberController扩展了Controller{公共函数actionIndex(){ $ model=new Member();$ model-username=' abei ';if($ model-save()==false){ var _ dump($ model-getErrors());} var _ dump($ model-to array());}}让我们看看var_dump的$模型中的created_at和updated_at是否有数据。
我想你喜欢这个结果。通过将关联添加到行为,时间填充函数被添加到成员类。不仅如此,TimestampBehavior还提供了一个有趣的触控功能,可以将当前时间戳分配给指定的属性并保存到数据库中。
也许这种方法的使用更接近你脑海中的行为。
$ member-touch(' do _ time ');成员本身没有触控功能,但是有触控方法,因为是TimestampBehavior注入的。与自己编写一个方法相比,行为可以注入到很多类中,复用率非常高。
属性行为
接下来,我们来解释一下yii2的第二个行为类。如果你仔细观察,你会发现上面的几个行为类都是从这个类继承过来的。这个类的使用方法是什么?它支持在触发AR事件时自动修改其属性。
让我们假设场景与上面的成员数据表相同。我们向其中添加一个令牌字段。该字段的值在生成数据时初始化,值为用户名的md5。当所有成员都初始化时,就会发生这种情况。现在使用属性行为来修复它。
第一步是建立成员模型
仍然在它的行为方法中,我们将其设置如下
//app models member . phpnamespace app models;使用Yii使用yii 行为属性行为;使用yii db ActiveRecord类成员扩展yiidbActiveRecord {公共函数行为(){ return[[' class '=attributebehavior 3360: class name(),' attributes '=[active record 3360: event _ BEFORE _ INSERT=' token ',],' value '=function($ event){ return MD5($ this-username);}, ], ];}}我们仍然使用上例第二步的动作代码,没有做任何改动,通过行为来看注入类的功能增强。
迟滞行为
我们来谈谈行为类SluggableBehavior。很少有人在网上谈论过,所以我们不要落后。
使用SluggableBehavior可以让我们的URL美化更具语义性。
或者上面的例子,如果我们想通过url获取某个成员的信息,我们通常这样写http://abc.com/index.php?r=me.
正确所以我们可以得到id=3的成员信息。但是,我们和搜索引擎都不喜欢这个网址,所以现在我们经常使用http://abc.com/member/view/3,的格式,这种格式非常简单,可以很容易地通过网址美化来实现。
然而,这不是我们最喜欢的。他们都在谈论url的语义。我认为以下网址是我们想要的
我在http://abc.com/member/beijing. http://abc.com/member/wang-hao的数据表的用户名分别对应王浩和北京小思的记录。这样的网址不仅美观,而且安全性好。
下面我就来说说它的实现步骤。首先,我需要向成员表中添加一个名为slug的字段。
//迁移代码如下:$ this-addcolumn ('member ',' slug ',$ this-string(64)-not null());配置模型
首先,我们仍然需要将SluggableBehavior注入到成员模型中,以增强其功能。
命名空间应用模型;使用Yii使用yii behaviors slugablebehavior;使用yii db ActiveRecord类成员扩展yiidbActiveRecord{.public function behaviors(){ return[[' class '=slugablebehavior : class name(),' attribute'='username ',//'slugAttribute'='slug ',],];}}需要注意的是,yii2框架的slugAttribute默认为slug,我们刚刚在数据表中添加的字段也叫slug,所以不需要设置slugAttribute。
接下来,我们生成一个username=wang hao的记录,你会发现这个记录的slug被wang-hao自动填充
Url美化
当然,到目前为止,我们仍然无法通过http://abc.com/memberr/wang-hao,我们仍然需要乌尔曼辛格的支持。
行动的执行
接下来,在我们的成员控制器中,
命名空间app 控制器;使用yii web 控制器;使用应用模型成员;类MemberController扩展了Controller { public function actionSlug($ slug){ $ model=member 3360: find()-其中([' slug '=$ slug])-one(); yii helper vardump 3360: dump($ model-to array(),10,true);die();}}然后你访问了/会员/王浩,得到了想要的结果。
这种情况经常出现在许多博客和cms网站上。比如可以访问月光博客查看其网址,通过SluggableBehavior行为帮助我们省去自己填写slug的麻烦,自动添加。
当然这个行为类的一个缺点就是不支持中文。如果你的领域是中文,那就没法分析。没关系。我们将在下一节解释如何让他支持中文
关于SluggableBehavior还有几个参数需要解释
public function behaviors(){ return [' class '=slugablebehavioration : class name(),' attribute'='username ','不可变'=true,' ensureUnique'=true,],];}不可变此参数默认为false。当设置为true时,一旦生成记录,即使“属性”=“用户名”字段稍后更新,slug值也不会改变。
确保唯一此参数默认为假。当设置为true时,它可以有效地避免重复的slugs。如果两个用户名都叫王皓,生成的鼻涕虫就是王皓和王皓-2。
另外两个
剩下两种行为,即可责备行为和属性类型行为。其实在这里你应该感觉到yii2的内置行为主要是增强AR模型的属性,这是最常用的一种。
通过对以上三种行为的研究,我认为你很容易处理好这两种。我不会解释代码,但谈谈这两个行为的功能。
应受责备的行为
这个行为主要是自动为一个ar对应的数据表填写当前登录成员ID
public function behaviors(){ return [' class '=Combrable behavior : class name(),' createdByAttribute'='author_id ',' updatedByAttribute '=' updater _ id ',],];}如果是后台模块,可以设置取值字段获取登录ID。
属性类型行为
AttributeTypecastBehavior是yii2在v2.0.10中添加的,主要提供一种自动转换模型属性格式的行为,对于MongoDB或者Redis这样的非模态数据库非常有用。
目前,该行为提供的类型如下
const TYPE _ INTEGER=' integerconst TYPE _ FLOAT=' floatconst TYPE _ BOOLEAN=' booleanconst TYPE _ STRING=' string当然,它还提供了一个手动方法typecastAttributes,您可以直接调用它来转换属性格式。
最后
以上是yii2提供的五个内置行为类,这些行为(主要是前三个)可以帮助我们减少大量的代码编写。
当然,在接下来的章节中,你会逐渐认识到行为更强大的方面,并一起期待。
以上就是本文的全部内容。希望本文的内容能给你的学习或工作带来一些帮助。有问题可以留言交流。谢谢你的支持。