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 执行系统命令的方法
Jul 07 PHP
destoon之一键登录设置
Jun 21 PHP
ThinkPHP跳转页success及error模板实例教程
Jul 17 PHP
Thinkphp多文件上传实现方法
Oct 31 PHP
php进行支付宝开发中return_url和notify_url的区别分析
Dec 22 PHP
php根据生日计算年龄的方法
Jul 13 PHP
php curl模拟post请求和提交多维数组的示例代码
Nov 19 PHP
PHP图形计数器程序显示网站用户浏览量
Jul 20 PHP
PHP编程计算日期间隔天数的方法
Apr 26 PHP
yii 2.0中表单小部件的使用方法示例
May 23 PHP
使用YII2框架实现微信公众号中表单提交功能
Sep 04 PHP
PHP中__set()实例用法和基础讲解
Jul 23 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
ThinkPHP 3.2 数据分页代码分享
2014/10/14 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
Javascript 生成指定范围数值随机数
2009/01/09 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
Javascript的比较汇总
2016/07/25 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
nodejs模块学习之connect解析
2017/07/05 NodeJs
JS扩展String.prototype.format字符串拼接的功能
2018/03/09 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
一篇文章看懂JavaScript中的回调
2021/01/05 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
用Python的urllib库提交WEB表单
2009/02/24 Python
python开发之list操作实例分析
2016/02/22 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
pytorch点乘与叉乘示例讲解
2019/12/27 Python
python输出pdf文档的实例
2020/02/13 Python
Python爬虫破解登陆哔哩哔哩的方法
2020/11/17 Python
eBay德国站:eBay.de
2017/09/14 全球购物
GoDaddy英国:全球排名第一的域名注册商
2018/06/08 全球购物
美国隐形眼镜网上商店:Lens.com
2019/09/03 全球购物
JRE、JDK、JVM之间的关系怎样
2012/05/16 面试题
乡镇党建工作汇报材料
2014/08/14 职场文书
成绩单评语
2015/01/04 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
实习指导老师意见
2015/06/04 职场文书
js基础语法与maven项目配置教程案例
2021/07/15 Javascript
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS