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 print EOF实现方法
May 21 PHP
php文档更新介绍
Jul 22 PHP
PHP取整数函数常用的四种方法小结
Jul 05 PHP
深入phpMyAdmin的安装与配置的详细步骤
May 07 PHP
ThinkPHP之A方法实例讲解
Jun 20 PHP
php图片上传类 附调用方法
May 15 PHP
php使用get_class_methods()函数获取分类的方法
Jul 20 PHP
php安装扩展mysqli的实现步骤及报错解决办法
Sep 23 PHP
laravel实现简单用户权限的示例代码
May 28 PHP
PHP项目多语言配置平台实现过程解析
May 18 PHP
PHP http请求超时问题解决方案
Nov 13 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
Mar 09 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中volist标签用法示例
2016/12/06 PHP
十分钟打造AutoComplete自动完成效果代码
2009/12/26 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
2010/12/28 Javascript
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
JavaScript转换农历类实现及调用方法
2013/01/27 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
JS实现同时搜索百度和必应的方法
2015/01/27 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
BootStrap的双日历时间控件使用
2017/07/25 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
2019/09/05 Javascript
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
Python win32com 操作Exce的l简单方法(必看)
2017/05/25 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
Python 绘制酷炫的三维图步骤详解
2019/07/12 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
使用HTML5的表单验证的简单示例
2015/09/09 HTML / CSS
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
建筑施工实习自我鉴定
2013/09/19 职场文书
办公室文秘自我评价
2013/09/21 职场文书
跟单文员的岗位职责
2013/11/14 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
百年校庆节目主持词
2014/03/27 职场文书
个人担保书范文
2014/05/20 职场文书
大型公益活动策划方案
2014/08/20 职场文书
服务行业演讲稿
2014/09/02 职场文书
毕业设计致谢词
2015/05/14 职场文书
物业公司管理制度
2015/08/05 职场文书
pandas DataFrame.shift()函数的具体使用
2021/05/24 Python
React-vscode使用jsx语法的问题及解决方法
2021/06/21 Javascript