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 和 XML: 使用expat函数(一)
Oct 09 PHP
第四章 php数学运算
Dec 30 PHP
thinkPHP的Html模板标签使用方法
Nov 13 PHP
PHP运行模式的深入理解
Jun 03 PHP
Laravel 5 学习笔记
Mar 06 PHP
PHP遍历数组的方法汇总
Apr 30 PHP
利用PHP命令行模式采集股票趋势信息
Aug 09 PHP
php支付宝在线支付接口开发教程
Sep 19 PHP
PHP二维数组去重实例分析
Nov 18 PHP
PHP实现微信图片上传到服务器的方法示例
Jun 29 PHP
php 广告点击统计代码(php+mysql)
Feb 21 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 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
PHP的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
百度站点地图(百度sitemap)生成方法分享
2014/01/09 PHP
php中session使用示例
2014/03/29 PHP
PHP判断表单复选框选中状态完整例子
2014/06/24 PHP
PHP的error_reporting错误级别变量对照表
2014/07/08 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
2007/08/13 Javascript
php gethostbyname获取域名ip地址函数详解
2010/01/24 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
JS跨域总结
2012/08/30 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
js获取视频时长代码
2014/04/10 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
jQuery解决IE6、7、8不能使用 JSON.stringify 函数的问题
2016/05/31 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
node.js实现快速截图
2016/08/27 Javascript
Javascript网页抢红包外挂实现分享
2018/01/11 Javascript
vue数据初始化initState的实例详解
2019/04/11 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
JavaScript实现雪花飘落效果
2020/12/27 Javascript
Python对象体系深入分析
2014/10/28 Python
Python访问MySQL封装的常用类实例
2014/11/11 Python
python操作gmail实例
2015/01/14 Python
Python2.x版本中cmp()方法的使用教程
2015/05/14 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
2017/06/14 Python
Python实现查询某个目录下修改时间最新的文件示例
2018/08/29 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
Python requests及aiohttp速度对比代码实例
2020/07/16 Python
python3.5的包存放的具体路径
2020/08/16 Python
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
客服部工作职责范本
2014/02/14 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
公司财务人员岗位职责
2015/04/14 职场文书
升学宴来宾致辞
2015/07/27 职场文书