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
PHP执行linux系统命令的常用函数使用说明
Apr 27 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
Sep 22 PHP
php版淘宝网查询商品接口代码示例
Jun 17 PHP
PHP判断数据库中的记录是否存在的方法
Nov 14 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
Nov 22 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
Dec 22 PHP
详谈PHP程序Laravel 5框架的优化技巧
Jul 18 PHP
PHP5.4起内置web服务器使用方法
Aug 09 PHP
利用PHP获取汉字首字母并且分组排序详解
Oct 22 PHP
PHP实现百度人脸识别
May 06 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
Jul 09 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
重置版宣传动画
2020/04/09 魔兽争霸
PHP中创建并处理图象
2006/10/09 PHP
第二章 PHP入门基础之php代码写法
2011/12/30 PHP
PHP实现C#山寨ArrayList的方法
2015/07/16 PHP
javascript css float属性的特殊写法
2008/11/13 Javascript
js 对象是否存在判断
2009/07/15 Javascript
网页禁用右键实现代码(JavaScript代码)
2009/10/29 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
javascript 回到顶部效果的实现代码
2014/02/17 Javascript
JavaScript异步回调的Promise模式封装实例
2014/06/07 Javascript
jQuery原理系列-css选择器的简单实现
2016/06/07 Javascript
jQuery给div,Span, a ,button, radio 赋值与取值
2016/06/24 Javascript
ECMAScript6快速入手攻略
2016/07/18 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
2018/08/15 Javascript
详解vuex 渐进式教程实例代码
2018/11/27 Javascript
js实现视图和数据双向绑定的方法分析
2020/02/05 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
英国第一豪华护肤品牌:Elemis
2017/10/12 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
刘胡兰的英雄事迹材料
2014/02/11 职场文书
政府信息公开实施方案
2014/05/09 职场文书
悬空寺导游词
2015/02/05 职场文书
宾馆前台接待岗位职责
2015/04/02 职场文书
农村环境卫生倡议书
2015/04/29 职场文书
十二生肖观后感
2015/06/12 职场文书
家属联谊会致辞
2015/07/31 职场文书
重阳节主题班会
2015/08/17 职场文书
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript
MySql数据库触发器使用教程
2022/06/01 MySQL