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 相关文章推荐
用PHP实现小型站点广告管理
Oct 09 PHP
PHP4实际应用经验篇(2)
Oct 09 PHP
PHP类中Static方法效率测试代码
Oct 17 PHP
PHP项目开发中最常用的自定义函数整理
Dec 02 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
Apr 10 PHP
ThinkPHP CURD方法之limit方法详解
Jun 18 PHP
php实现遍历目录并删除指定文件中指定内容
Jan 21 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
Laravel5.7框架安装与使用学习笔记图文详解
Apr 02 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
Oct 21 PHP
laravel框架邮箱认证实现方法详解
Nov 22 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/01 无线电
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
php xhprof使用实例详解
2019/04/15 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
My Desktop :) 桌面式代码
2008/12/29 Javascript
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
浅谈struts1 & jquery form 文件异步上传
2017/05/25 jQuery
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
微信小程序模拟cookie的实现
2018/06/20 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
python冒泡排序简单实现方法
2015/07/09 Python
python实现决策树
2017/12/21 Python
用tensorflow构建线性回归模型的示例代码
2018/03/05 Python
Django中create和save方法的不同
2019/08/13 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
腾讯公司的一个sql题
2013/01/22 面试题
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
师范毕业生个人求职信
2013/12/09 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
酒鬼酒广告词
2014/03/21 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书
详解python的内存分配机制
2021/05/10 Python
html+css实现环绕倒影加载特效
2021/07/07 HTML / CSS
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis