前言

众所周知学习所有知识都需要循序渐进,行为也是一样,在我们学会很牛逼的新建行为,然后轻松注入到组件类之前,先看看yii2框架为我们准备的5个内置的行为类,也许你刚要用到~话不多说了,来一起看看详细的介绍:

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

先亮亮相

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提供的5个内置的行为类,通过这些行为(主要是前3个)可以帮我们减少很多代码的编写。

当然后续的章节你将慢慢体会到行为的更多给力之处,一起期待。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

php内置类,yii2学习教程之5种内置行为类详解相关推荐

  1. 【前端系列教程之CSS3】04_CSS定位和浮动详解

    一.CSS 定位(重点) 1.1 CSS 定位属性 position 属性指定了元素的定位类型. position 属性的五个值: static 静态定位,无特殊定位,对象遵循正常文档流.top,ri ...

  2. STL快速入门学习教程之map的简单使用

    STL快速入门学习教程之map的简单使用 map是STL中的一个关联容器,它以一对一的数据进行整理(第一个数值称为关键字,且这个关键字只能在map中出现一次,第二个数值称为前关键字的值),正是由于这种 ...

  3. 嵌入式知识-ARM裸机-学习笔记(9):SD卡启动详解(S5PV210)

    嵌入式知识-ARM裸机-学习笔记(9):SD卡启动详解(S5PV210) 一.SD卡介绍 1. SD卡背景知识和特点 SD卡.MMC卡.MicroSD.TF卡:这些卡其实内部就是Flash存储颗粒,比 ...

  4. 【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一

    相关链接 [2023年第十一届泰迪杯数据挖掘挑战赛]C题泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一 [2023年第十一届泰迪杯数据挖掘挑战赛]C题泰迪内推平台招聘与求职 ...

  5. Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解

    Spring MVC 学习总结(二)--控制器定义与@RequestMapping详解 目录 一.控制器定义 1.1.实现接口Controller定义控制器 1.2.使用注解@Controller定义 ...

  6. Keras深度学习实战(3)——神经网络性能优化技术详解

    Keras深度学习实战(3)--神经网络性能优化技术详解 0. 前言 1. 缩放输入数据集 1.1 数据集缩放的合理性解释 1.2 使用缩放后的数据集训练模型 2. 输入值分布对模型性能的影响 3. ...

  7. 【深度学习/机器学习】为什么要归一化?归一化方法详解

    [深度学习/机器学习]为什么要归一化?归一化方法详解 文章目录 1. 介绍 1.1 什么是归一化 1.2 归一化的好处 2. 归一化方法 2.1 最大最小标准化(Min-Max Normalizati ...

  8. 离线强化学习(Offline RL)系列3: (算法篇) Onestep 算法详解与实现

    [更新记录] 论文信息: David Brandfonbrener, William F. Whitney, Rajesh Ranganath, Joan Bruna: "Offline R ...

  9. 深度学习之目标检测(五)-- RetinaNet网络结构详解

    深度学习之目标检测(五)-- RetinaNet网络结构详解 深度学习之目标检测(五)RetinaNet网络结构详解 1. RetinaNet 1.1 backbone 部分 1.2 预测器部分 1. ...

最新文章

  1. 电脑b站html加速播放,b站投稿如何提高播放速度?如何2倍速?b站播放器选择倍速快捷方式...
  2. HPC China2016全国高性能计算学术年会即将举行
  3. javascript --- 利用节点关系访问HTML元素
  4. 0运维?微信小程序云开发增删查改【05】
  5. 2018年3月计算机二级考试题,2018年3月计算机二级考试Access综合试题十
  6. golang 解决 TCP 粘包问题
  7. 中国连接系统市场趋势报告、技术动态创新及市场预测
  8. 深度神经进化大有可为?Uber详解如何用它优化强化学习 | 5篇论文
  9. Python学习笔记-Tuple
  10. 错误代码1833 Cannot change column used in a foreign
  11. java NIO入门小记
  12. 无锁循环缓冲区的实现c语言,C++ 无锁环形缓冲区实现
  13. Linux学习(一)虚拟机安装linux资源,linux目录结构,购买阿里云服务器远程登陆linux,下载安装并使用Xshell与Xftp
  14. NOIP2003 侦探推理 详解
  15. 微信小程序:扫描身份证读取身份信息
  16. java倒计时器_java – 使用计时器倒计时
  17. 尚硅谷-宋红康-MySQL高级性能篇
  18. 医学图像重采样spacing和direction
  19. 【Linux云计算架构:第三阶段-Linux高级运维架构】第13章——redis
  20. NLP系列经典论文(1)-- Attention Is All You Need

热门文章

  1. 大剑无锋之一句话输出表中每一个同学的成绩最高的课程【面试推荐】
  2. 从架构设计、部署方式、使用方法、应用场景等方面,比较tfs、hdfs、fastdfs、Tachyon的异同
  3. Scala _07trait特性
  4. springMVC——Xml配置方式实现Helloworld
  5. C语言文件操作(二)对指定txt文件中的N个数排序
  6. 在Spring Boot中配置web app
  7. Redis学习之Sentinel(四)
  8. Effective Java之消除过期的引用(六)
  9. 判断对象存活方法及回收方法
  10. spark-jar冲突解决方案