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
模拟OICQ的实现思路和核心程序(二)
Oct 09 PHP
php将gd生成的图片缓存到memcache的小例子
Jun 05 PHP
PHP获取文件的MD5值并判断是否被修改的例子
Jun 19 PHP
thinkphp数据查询和遍历数组实例
Nov 28 PHP
php基于表单密码验证与HTTP验证用法实例
Jan 06 PHP
smarty内置函数section的用法
Jan 22 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
PHP实现基于mysqli的Model基类完整实例
Apr 08 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 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实现的遍历文件夹下所有文件,编辑删除
2010/01/05 PHP
php下拉选项的批量操作的实现代码
2013/10/14 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
javascript获得CheckBoxList选中的数量
2009/10/27 Javascript
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
预加载css或javascript的js代码
2010/04/23 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
PHP 数组current和next用法分享
2015/03/05 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
全面理解闭包机制
2016/07/11 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
2016/09/08 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
2017/04/25 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
2017/06/06 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
node 利用进程通信实现Cluster共享内存
2017/10/27 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
JS实现显示当前日期的实例代码
2018/07/03 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
详解vue组件之间的通信
2020/08/30 Javascript
python正则分析nginx的访问日志
2017/01/17 Python
浅谈Python实现2种文件复制的方法
2018/01/19 Python
Python中几种属性访问的区别与用法详解
2018/10/10 Python
Python实现常见的回文字符串算法
2018/11/14 Python
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
方正Java笔试题
2014/07/03 面试题
优秀员工自荐书范文
2013/12/08 职场文书
环保建议书600字
2014/05/14 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
派出所班子党的群众路线对照检查材料思想汇报
2014/10/01 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
朋友离别感言
2015/08/04 职场文书
python的html标准库
2022/04/29 Python