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 相关文章推荐
超级简单的发送邮件程序
Oct 09 PHP
一个可以删除字符串中HTML标记的PHP函数
Oct 09 PHP
比较时间段一与时间段二是否有交集的php函数
May 31 PHP
在php中判断一个请求是ajax请求还是普通请求的方法
Jun 28 PHP
php利用单例模式实现日志处理类库
Feb 10 PHP
Windows中使用计划任务自动执行PHP程序实例
May 09 PHP
php通过ksort()函数给关联数组按照键排序的方法
Mar 18 PHP
php实现在限定区域里自动调整字体大小的类实例
Apr 02 PHP
php使用GD创建保持宽高比缩略图的方法
Apr 17 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
Feb 26 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
ThinkPHP5 验证器的具体使用
May 31 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
轻松入门: 煮好咖啡的七个诀窍
2021/03/03 冲泡冲煮
PHP 获取远程文件内容的函数代码
2010/03/24 PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
2011/10/23 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
PHP 传输会话curl函数的实例详解
2017/09/12 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
jquery multiSelect 多选下拉框
2010/07/09 Javascript
Notify - 基于jquery的消息通知插件
2011/10/18 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
Jquery读取URL参数小例子
2013/08/30 Javascript
jquery获取复选框被选中的值
2014/03/22 Javascript
JavaScript保存并运算页面中数字类型变量的写法
2015/07/06 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
教你如何终止JQUERY的$.AJAX请求
2016/02/23 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
JS请求servlet功能示例
2017/06/01 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
React+TypeScript+webpack4多入口配置详解
2019/08/08 Javascript
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
Python3标准库总结
2019/02/19 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
校园活动策划书范文
2014/01/10 职场文书
期末评语大全
2014/05/04 职场文书
创先争优活动党员公开承诺书
2014/08/29 职场文书
党支部培养考察意见
2015/06/02 职场文书
党支部鉴定意见
2015/06/02 职场文书
爱的教育观后感
2015/06/17 职场文书
2015年酒店销售部工作总结
2015/07/24 职场文书
使用Nginx搭载rtmp直播服务器的方法
2021/10/16 Servers
Python利用capstone实现反汇编
2022/04/06 Python
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android