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 全局变量范围分析
Aug 07 PHP
7个超级实用的PHP代码片段
Jul 11 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
Nov 09 PHP
PHP教程之PHP中shell脚本的使用方法分享
Feb 23 PHP
php生成二维码的几种方式整理及使用实例
Jun 03 PHP
PHP中date与gmdate的区别及默认时区设置
May 12 PHP
php返回当前日期或者指定日期是周几
May 21 PHP
php实现微信公众号主动推送消息
Dec 31 PHP
php实现图片上传并进行替换操作
Mar 15 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
Nov 14 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 PHP
tp5框架基于ajax实现异步删除图片的方法示例
Feb 10 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全局变量和类配合使用深刻理解
2013/06/05 PHP
PHP遍历文件夹与文件类及处理类用法实例
2014/09/23 PHP
php实现数组按指定KEY排序的方法
2015/03/30 PHP
php实现中文字符截取防乱码方法汇总
2015/04/29 PHP
利用谷歌地图API获取点与点的距离的js代码
2012/10/11 Javascript
jQuery写fadeTo示例代码
2014/02/21 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
js类定义函数时用prototype与不用的区别示例介绍
2014/06/10 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
javascript面向对象之定义成员方法实例分析
2015/01/13 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
纯js实现画一棵树的示例
2017/09/05 Javascript
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
layui 中select下拉change事件失效的解决方法
2019/09/20 Javascript
JS实现手风琴特效
2020/11/08 Javascript
Javascript 模拟mvc实现点餐程序案例详解
2020/12/24 Javascript
使用Python从零开始撸一个区块链
2018/03/14 Python
Python对List中的元素排序的方法
2018/04/01 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
python实现随机加减法生成器
2020/02/24 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
会计大学生职业生涯规划书范文
2014/01/13 职场文书
医校毕业生自我鉴定
2014/01/25 职场文书
舞蹈比赛获奖感言
2014/02/04 职场文书
幼师求职自荐信
2015/03/26 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB
Vue+TypeScript中处理computed方式
2022/04/02 Vue.js