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 相关文章推荐
用函数读出数据表内容放入二维数组
Oct 09 PHP
php下载远程文件类(支持断点续传)
Nov 14 PHP
FirePHP 推荐一款PHP调试工具
Apr 23 PHP
第4章 数据处理-php数组的处理-郑阿奇
Jul 04 PHP
Win下如何安装PHP的APC拓展
Aug 07 PHP
DOM XPATH获取img src值的query
Sep 23 PHP
php读取flash文件高宽帧数背景颜色的方法
Jan 06 PHP
使用Huagepage和PGO来提升PHP7的执行性能
Nov 30 PHP
php版交通银行网银支付接口开发入门教程
Sep 26 PHP
php+mysql+jquery实现日历签到功能
Feb 27 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
Jun 19 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 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
基于OpenCV的PHP图像人脸识别技术
2009/10/11 PHP
9个经典的PHP代码片段分享
2014/12/18 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
2015/05/13 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
PHP的介绍以及优势详细分析
2019/09/05 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
2020/04/14 PHP
jQuery选择没有colspan属性的td的代码
2010/07/06 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
node.js入门教程迷你书、node.js入门web应用开发完全示例
2014/04/06 Javascript
概述BootStrap中role=&quot;form&quot;及role作用角色
2016/12/08 Javascript
使用angular帮你实现拖拽的示例
2017/07/05 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
JS 60秒后重新发送验证码的实例讲解
2017/07/26 Javascript
使用 Node.js 开发资讯爬虫流程
2018/01/07 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
vue debug 二种方法
2018/09/16 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
2018/12/11 Javascript
JS实现的贪吃蛇游戏完整实例
2019/01/18 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
一文搞懂ES6中的Map和Set
2019/05/20 Javascript
CentOS6.5设置Django开发环境
2016/10/13 Python
django celery redis使用具体实践
2019/04/08 Python
浅谈Python中函数的定义及其调用方法
2019/07/19 Python
python 提取文件指定列的方法示例
2019/08/07 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
详细分析Python collections工具库
2020/07/16 Python
python3字符串输出常见面试题总结
2020/12/01 Python
HTML5之SVG 2D入门4—笔画与填充
2013/01/30 HTML / CSS
业务助理岗位职责
2013/11/18 职场文书
美化环境标语
2014/06/20 职场文书
放飞梦想演讲稿200字
2014/08/26 职场文书
颐和园导游词
2015/01/30 职场文书
2015年环卫工作总结
2015/04/28 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书
详细了解java监听器和过滤器
2021/07/09 Java/Android
CSS中实现动画效果-附案例
2022/02/28 HTML / CSS