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 相关文章推荐
使用 MySQL 开始 PHP 会话
Dec 21 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
Jun 17 PHP
php实现的百度搜索某地天气的小偷代码
Apr 23 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 PHP
PHP保存带BOM文件的方法
Feb 12 PHP
php使用GD实现颜色渐变实例
Jun 02 PHP
PHP使用Pear发送邮件(Windows环境)
Jan 05 PHP
PHP数组编码gbk与utf8互相转换的两种方法
Sep 01 PHP
php set_include_path函数设置 include_path 配置选项
Oct 30 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
PHP curl批处理及多请求并发实现方法分析
Aug 15 PHP
laravel利用中间件做防非法登录和权限控制示例
Oct 21 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 fastcgi模式上传大文件(大约有300多K)报错
2014/09/28 PHP
php通过function_exists检测函数是否存在的方法
2015/03/18 PHP
PHP异常处理Exception类
2015/12/11 PHP
必须收藏的php实用代码片段
2016/02/02 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
innerHTML,outerHTML,innerTEXT三者之间的区别
2007/01/28 Javascript
jscript之List Excel Color Values
2007/06/13 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
jquery中trigger()无法触发hover事件的解决方法
2015/05/07 Javascript
JQuery插入DOM节点的方法
2015/06/11 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
Node.js文件编码格式的转换的方法
2018/04/27 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
2020/07/29 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
layui table复选框禁止某几条勾选的实例
2019/09/20 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
Python对数据库操作
2016/03/28 Python
PyQt4实时显示文本内容GUI的示例
2019/06/14 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
2020/02/18 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
Python中Yield的基本用法
2020/10/18 Python
python绘制高斯曲线
2021/02/19 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
美国领先的奢侈手表在线零售商:WatchMaxx
2017/12/17 全球购物
大四毕业生学习总结的自我评价
2013/10/31 职场文书
银行内勤岗位职责
2014/04/09 职场文书
市场开发计划书
2014/05/07 职场文书
汽修专业自荐信
2014/07/07 职场文书
2015年员工试用期工作总结
2014/12/12 职场文书
利用Python脚本写端口扫描器socket,python-nmap
2022/07/23 Python