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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(2)
Oct 09 PHP
php下使用SimpleXML 处理XML 文件
Feb 27 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
php多个字符串替换成同一个的解决方法
Jun 18 PHP
ThinkPHP模板IF标签用法详解
Jul 01 PHP
PHP动态编译出现Cannot find autoconf的解决方法
Nov 05 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
Dec 17 PHP
PHP实现的多文件上传类及用法示例
May 06 PHP
PHP中的浅复制与深复制的实例详解
Oct 26 PHP
PHP设计模式之PHP迭代器模式讲解
Mar 22 PHP
php实现的数组转xml案例分析
Sep 28 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 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语法(2)
2006/10/09 PHP
php后台多用户权限组思路与实现程序代码分享
2012/02/13 PHP
利用PHP生成静态HTML文档的原理
2012/10/29 PHP
深入php函数file_get_contents超时处理的方法详解
2013/06/03 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
php使用file函数、fseek函数读取大文件效率对比分析
2016/11/04 PHP
jQuery的一些注意
2006/12/06 Javascript
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
jquery处理json对象
2014/11/03 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
jQuery自定义动画函数实例详解(附demo源码)
2015/12/10 Javascript
用js实现简单算法的实例代码
2016/09/24 Javascript
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
npm 常用命令详解(小结)
2019/01/17 Javascript
JS计算斐波拉切代码实例
2019/09/12 Javascript
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
详解Python 模拟实现生产者消费者模式的实例
2017/08/10 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
python线程池threadpool实现篇
2018/04/27 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
Python之lambda匿名函数及map和filter的用法
2019/03/05 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
Python time库基本使用方法分析
2019/12/13 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
Python如何定义一个函数
2015/09/01 面试题
应用化学专业本科生求职信
2013/09/29 职场文书
中学生个人自我评价
2014/02/06 职场文书
2019年七夕情人节浪漫祝福语大全!
2019/08/08 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书