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自定义函数返回多个值
Nov 26 PHP
关于PHP实现异步操作的研究
Feb 03 PHP
php检测网页是否被百度收录的函数代码
Oct 09 PHP
教你如何用php实现LOL数据远程获取
Jun 10 PHP
PHP防止注入攻击实例分析
Nov 03 PHP
YII CLinkPager分页类扩展增加显示共多少页
Jan 29 PHP
java模拟PHP的pack和unpack类
Apr 13 PHP
php实现批量修改文件名称的方法
Jul 23 PHP
[原创]php正则删除img标签的方法示例
May 27 PHP
php写入mysql中文乱码的实例解决方法
Sep 17 PHP
Laravel框架Blade模板简介及模板继承用法分析
Dec 03 PHP
通过实例解析PHP数据类型转换方法
Jul 11 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 base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
php后台多用户权限组思路与实现程序代码分享
2012/02/13 PHP
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
Laravel框架路由配置总结、设置技巧大全
2014/09/03 PHP
详谈PHP编码转换问题
2015/07/28 PHP
PHP中如何使用Redis接管文件存储Session详解
2018/11/28 PHP
关于JavaScript中原型继承中的一点思考
2012/07/25 Javascript
从jquery的过滤器.filter()方法想到的
2013/09/29 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
用Jquery实现滚动新闻
2014/02/12 Javascript
jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】
2016/07/19 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
React学习之事件绑定的几种方法对比
2017/09/24 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
Echarts动态加载多条折线图的实现代码
2019/05/24 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
[01:22:19]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
2018/04/28 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
python检测服务器端口代码实例
2019/08/31 Python
Python 多线程,threading模块,创建子线程的两种方式示例
2019/09/29 Python
Python hashlib模块加密过程解析
2019/11/05 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
python线程优先级队列知识点总结
2021/02/28 Python
CSS3 @font-face属性使用指南
2014/12/12 HTML / CSS
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
英国儿童设计师服装和玩具购物网站:Zac & Lulu
2020/10/19 全球购物
王老吉广告词
2014/03/20 职场文书
保护环境建议书100字
2014/05/13 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
redis数据一致性的实现示例
2022/03/18 Redis