YII2框架中behavior行为的理解与使用方法示例


Posted in PHP onMarch 13, 2020

本文实例讲述了YII2框架中behavior行为的理解与使用方法。分享给大家供大家参考,具体如下:

YII2中的行为说白了就是对组件功能的扩展,在不改变继承关系的条件下。

行为附加到组件后,行为将注入自已的方法和属性到组件,可以像组件访问自定义的方法和属性一样访问行为。

注意行为是对功能的扩展,不要乱用行为,比如有一个动物类和一个人类,他们各自有自已的名称,身高,体重,这些是属性。

他们都会跑,这个时候我们就可以抽象出来做成一个跑的行为,根据不同需求来扩展他们。

这里我们有两个控制器一个GoodsController,一个OrderController,他们都接收请求,返回数据给客户端,不过有的需要返回json,有的需要返回xml。

那么我们就创建一个返回数据行为来扩展这两个控制器。

我们在项目目录下创建common目录,并创建ReturnBehavior.php,代码如下:

<?php

namespace app\common;

use YII;
use yii\base\Behavior;
use yii\web\Controller;
use yii\web\Response;

//必须继承自yii\base\Behavior
class ReturnBehavior extends Behavior
{

  //返回类型,通过控制器里的behaviors()配置参数获取值
  public $return_type = '';

  //让行为响应组件的事件触发
  public function events()
  {
    return [
      //控制器方法执行后触发事件,调用returnData函数
      Controller::EVENT_AFTER_ACTION => 'returnData',
    ];
  }

  //返回数据
  public function returnData()
  {
    switch ($this->return_type) {
      case 'json':
        YII::$app->response->format = Response::FORMAT_JSON;
        break;
      case 'xml':
        YII::$app->response->format = Response::FORMAT_XML;
        break;
      case 'html':
        YII::$app->response->format = Response::FORMAT_HTML;
        break;
      default :
        break;
    }
  }

  //定义方法
  public function test() {
    echo 'returnBehavior test ...';
  }
}

然后我们在两个控制器中配置behaviors()来使用行为:

GoodsController.php代码如下:

<?php

namespace app\controllers;

use YII;
use app\common\ReturnBehavior;
use yii\web\Controller;

//想要使用行为,必须是component或是其子类
//yii\web\Controller继承自component,所以可以使用
class GoodsController extends Controller
{

  //配置控制器需要使用的行为
  public function behaviors()
  {
    return [
      'returnBehavior' => [
        'class' => ReturnBehavior::className(),
        'return_type' => 'json',
      ],
    ];
  }

  //获取商品列表
  public function actionGetGoodsList()
  {
    return [
      ['id' => 1, 'name' => '商品1'],
      ['id' => 2, 'name' => '商品2'],
    ];
  }

  public function actionIndex()
  {
    //控制器调用行为中的方法
    $this->getBehavior('returnBehavior')->test();
    //注意这里,因为使用了行为,方法执行后会设置返回内容为xml,我们重新设置为html
    $this->getBehavior('returnBehavior')->return_type = 'html';
  }
}

OrderController.php代码如下:

<?php

namespace app\controllers;

use YII;
use app\common\ReturnBehavior;
use yii\web\Controller;

//想要使用行为,必须是component或是其子类
//yii\web\Controller继承自component,所以可以使用
class OrderController extends Controller
{
  //配置控制器需要使用的行为
  public function behaviors()
  {
    return [
      'returnBehavior' => [
        'class' => ReturnBehavior::className(),
        'return_type' => 'xml',
      ],
    ];
  }

  //获取商品列表
  public function actionGetOrderList()
  {
    return [
      ['id' => 1, 'name' => '订单1'],
      ['id' => 2, 'name' => '订单2'],
    ];
  }

  public function actionIndex()
  {
    //控制器调用行为中的方法
    $this->getBehavior('returnBehavior')->test();
    //注意这里,因为使用了行为,方法执行后会设置返回内容为xml,我们重新设置为html
    $this->getBehavior('returnBehavior')->return_type = 'html';
  }
}

这个时候我们在地址栏访问/goods/get-goods-list和/order/get-order-list,结果如下:

YII2框架中behavior行为的理解与使用方法示例

然后我们访问/goods/index和/order/index,行为方法成功调用,结果如下:

YII2框架中behavior行为的理解与使用方法示例

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP中路径问题的解决方案
Oct 09 PHP
社区(php&amp;&amp;mysql)六
Oct 09 PHP
php radio 单选框获取与保持值的实现代码
May 15 PHP
谨慎使用PHP的引用原因分析
Sep 06 PHP
有关于PHP中常见数据类型的汇总分享
Jan 06 PHP
PHP错误WARNING: SESSION_START() [FUNCTION.SESSION-START]解决方法
May 04 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
Nov 09 PHP
php如何执行非缓冲查询API
Jul 22 PHP
PHP实现递归目录的5种方法
Oct 27 PHP
php微信公众号开发之微信企业付款给个人
Oct 04 PHP
关于Curl在Swoole协程中的解决方案详析
Sep 12 PHP
php ZipArchive实现多文件打包下载实例
Oct 31 PHP
YII2框架中actions的作用与使用方法示例
Mar 13 #PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 #PHP
TP5框架安全机制实例分析
Apr 05 #PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 #PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 #PHP
TP5框架实现签到功能的方法分析
Apr 05 #PHP
TP5框架页面跳转样式操作示例
Apr 05 #PHP
You might like
thinkPHP模型初始化实例分析
2015/12/03 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
js修改table中Td的值(定义td的单击事件)
2013/01/10 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
javascript数字时钟示例分享
2014/04/23 Javascript
JavaScript立即执行函数的三种不同写法
2014/09/05 Javascript
jquery 操作css样式、位置、尺寸方法汇总
2014/11/28 Javascript
JavaScript中的toUTCString()方法使用详解
2015/06/12 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
javascript原生ajax写法分享
2016/04/10 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
2016/05/05 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
简单理解vue中实例属性vm.$els
2016/12/01 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
jQuery实现动态给table赋值的方法示例
2017/07/04 jQuery
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
vue实现未登录跳转到登录页面的方法
2018/07/17 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
Python socket实现多对多全双工通信的方法
2019/02/13 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
Python 堆叠柱状图绘制方法
2019/07/29 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
CSS3中的注音对齐属性ruby-align用法指南
2016/07/01 HTML / CSS
运动鞋中的劳斯莱斯:索康尼(SAUCONY)
2017/08/09 全球购物
美国领先的眼镜和太阳镜在线零售商:Glasses.com
2019/08/26 全球购物
商务英语求职自荐信范文
2013/12/24 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
体育教育毕业生自荐信
2014/06/29 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
借钱欠条怎么写
2015/07/03 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书