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 相关文章推荐
如何过滤高亮显示非法字符
Oct 09 PHP
php学习之 认清变量的作用范围
Jan 26 PHP
PHP设计模式之结构模式的深入解析
Jun 13 PHP
PHP伪静态Rewrite设置之APACHE篇
Jul 30 PHP
实例讲解PHP面向对象之多态
Aug 20 PHP
PHP加密解密函数详解
Oct 28 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
Apr 26 PHP
详解PHP用substr函数截取字符串中的某部分
Dec 03 PHP
Zend Framework入门应用实例详解
Dec 11 PHP
PHP面向对象学习之parent::关键字
Jan 18 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
laravel 验证错误信息到 blade模板的方法
Sep 29 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读取msn上的用户信息类
2008/12/05 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
php性能优化分析工具XDebug 大型网站调试工具
2011/05/22 PHP
PHPExcel读取Excel文件的实现代码
2011/12/06 PHP
PHP获取文件行数的方法
2015/06/10 PHP
使用laravel根据用户类型来显示或隐藏字段
2019/10/17 PHP
关于jQuery中的each方法(jQuery到底干了什么)
2014/03/05 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
原生js实现公告滚动效果
2021/01/10 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
python快速排序代码实例
2013/11/21 Python
python批量提交沙箱问题实例
2014/10/08 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
Python 解决中文写入Excel时抛异常的问题
2018/05/03 Python
对PyTorch torch.stack的实例讲解
2018/07/30 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
如何基于pythonnet调用halcon脚本
2020/01/20 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
HTML5 Canvas——用路径描画线条实例介绍
2013/06/09 HTML / CSS
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
求职自荐信
2013/12/14 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
2021/06/09 Python
Python常遇到的错误和异常
2021/11/02 Python