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 相关文章推荐
第八节--访问方式
Nov 16 PHP
PHP面向对象的使用教程 简单数据库连接
Nov 25 PHP
PHP 获取远程文件内容的函数代码
Mar 24 PHP
使用PHP 5.0创建图形的巧妙方法
Oct 12 PHP
CodeIgniter框架提示Disallowed Key Characters的解决办法
Apr 21 PHP
PHP多个文件上传到服务器实例
Oct 29 PHP
php实现微信公众号无限群发
Oct 11 PHP
PHP使用PHPexcel导入导出数据的方法
Nov 14 PHP
超强多功能php绿色集成环境详解
Jan 25 PHP
老生常谈PHP中的数据结构:DS扩展
Jul 17 PHP
thinkPHP5框架路由常用知识点汇总
Sep 15 PHP
php微信小程序解包过程实例详解
Mar 31 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数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
2011/10/31 PHP
PHP中echo,print_r与var_dump区别分析
2014/09/29 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
2016/09/01 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
2016/11/22 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
2017/04/10 PHP
PHP substr()函数参数解释及用法讲解
2017/11/23 PHP
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
JavaScript 10件让人费解的事情
2010/02/15 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
JavaScript中的object转换函数toString()与valueOf()介绍
2014/12/31 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
浅谈Vue SSR 的 Cookies 问题
2017/11/20 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧不动,右侧滑动)
2019/01/23 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
浅谈vue的第一个commit分析
2020/06/08 Javascript
[02:49]2018DOTA2亚洲邀请赛主赛事决赛日战况回顾 Mineski鏖战5局夺得辉耀
2018/04/10 DOTA
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
python配置文件写入过程详解
2019/10/19 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
Python csv文件记录流程代码解析
2020/07/16 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
公司部门司机岗位职责
2014/01/03 职场文书
英文求职信写作小建议
2014/02/16 职场文书
优秀毕业生推荐信范文
2014/03/07 职场文书
公司董事长岗位职责
2014/06/08 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
2015年学校办公室工作总结
2015/05/26 职场文书
2016计算机专业毕业生自荐信
2016/01/28 职场文书
python 判断字符串当中是否包含字符(str.contain)
2022/06/01 Python