yii2学习教程之5种内置行为类详解


Posted in PHP onAugust 03, 2017

前言

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

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

先亮亮相

  • TimestampBehavior
  • SluggableBehavior
  • BlameableBehavior
  • AttributeTypecastBehavior
  • AttributeBehavior

网上很多文章只是讲解了其中的 TimestampBehavior ,我们把这些都讲下。

TimestampBehavior

自动更新模型对应数据表中的创建时间(created_at)与更新时间(updated_at)字段。

为了方便学习,我建立了一个member表,结构如下

yii2学习教程之5种内置行为类详解

对于 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 是否有数据?

yii2学习教程之5种内置行为类详解

对于结果我想你是喜欢的,通过增加了对行为的关联进而为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代码,不做任何改动,看看行为对所注入类的功能增强。

yii2学习教程之5种内置行为类详解

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了

yii2学习教程之5种内置行为类详解

Url美化

当然到此刻,通过 http://abc.com/memberr/wang-hao 我们依然得不到,还需要UrlMananger的支持。

yii2学习教程之5种内置行为类详解

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后,得到了想要的结果。

yii2学习教程之5种内置行为类详解

这个情况在很多博客和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

yii2学习教程之5种内置行为类详解

其他两个

还剩下 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 相关文章推荐
dedecms防止FCK乱格式化你的代码的修改方法
Mar 17 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
php中设置多级目录session的问题
Aug 08 PHP
php在服务器执行exec命令失败的解决方法
Mar 03 PHP
php使用反射插入对象示例分享
Mar 11 PHP
PHP四舍五入、取整、round函数使用示例
Feb 06 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
Jan 07 PHP
最新版本PHP 7 vs HHVM 多角度比较
Feb 14 PHP
php+MySql实现登录系统与输出浏览者信息功能
Jul 01 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
Apr 18 PHP
PHP编程获取各个时间段具体时间的方法
May 26 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
PHP实现的简单在线计算器功能示例
Aug 02 #PHP
利用php操作memcache缓存的基础方法示例
Aug 02 #PHP
Yii 2.0实现联表查询加搜索分页的方法示例
Aug 02 #PHP
YII框架中使用memcache的方法详解
Aug 02 #PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
Aug 02 #PHP
php7安装mongoDB扩展的方法分析
Aug 02 #PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
Aug 02 #PHP
You might like
PHP使用NuSOAP调用Web服务的方法
2015/07/18 PHP
TP5.0框架实现无限极回复功能的方法分析
2019/05/04 PHP
JS仿flash上传头像效果实现代码
2011/07/18 Javascript
各种常用的JS函数整理
2013/10/25 Javascript
javascript列表框操作函数集合汇总
2013/11/28 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
JavaScript获取页面中超链接数量的方法
2015/11/09 Javascript
js原生跨域_用script标签的简单实现
2016/09/24 Javascript
Angular+Bootstrap+Spring Boot实现分页功能实例代码
2017/07/21 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
python实现RSA加密(解密)算法
2016/02/17 Python
Python 登录网站详解及实例
2017/04/11 Python
python基本语法练习实例
2017/09/19 Python
详解Python开发中如何使用Hook技巧
2017/11/01 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
Python提取特定时间段内数据的方法实例
2019/04/01 Python
python实现可变变量名方法详解
2019/07/01 Python
python 按钮点击关闭窗口的实现
2020/03/04 Python
Python模块常用四种安装方式
2020/10/20 Python
神经网络训练采用gpu设置的方式
2021/03/03 Python
利用canvas实现图片下载功能来实现浏览器兼容问题
2019/05/31 HTML / CSS
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
JD Sports比利时官网:英国领先的运动鞋和运动服饰零售商
2018/10/10 全球购物
事务机电主管工作职责
2014/02/25 职场文书
授权委托书格式范文
2014/08/02 职场文书
入党积极分子十八届四中全会思想汇报
2014/10/23 职场文书
学校运动会感想
2015/08/10 职场文书
python pyhs2 的安装操作
2021/04/07 Python
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技