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使之能同时支持GIF和JPEG
Oct 09 PHP
PHP取得一个类的属性和方法的实现代码
May 22 PHP
php快递单号查询接口使用示例
May 05 PHP
CI框架中集成CKEditor编辑器的教程
Jun 09 PHP
php正则匹配html中带class的div并选取其中内容的方法
Jan 13 PHP
PHP数据库处理封装类实例
Dec 24 PHP
php图像验证码生成代码
Jun 08 PHP
PHP基于ORM方式操作MySQL数据库实例
Jun 21 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
PHP集成环境XAMPP的安装与配置
Nov 13 PHP
PHP PDOStatement::fetchColumn讲解
Jan 31 PHP
PHP设计模式概论【概念、分类、原则等】
May 01 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检测useragent版本示例
2014/03/24 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
2014/04/17 PHP
ThinkPHP之getField详解
2014/06/20 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
Joomla开启SEF的方法
2016/05/04 PHP
Yii CGridView用法实例详解
2016/07/12 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
PHP7新特性
2021/03/09 PHP
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
jquery实现鼠标滑过显示提示框的方法
2015/02/05 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
2017/03/23 jQuery
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
JavaScript代码执行的先后顺序问题
2017/10/29 Javascript
微信小程序调用摄像头隐藏式拍照功能
2018/08/22 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
[52:39]完美世界DOTA2联赛PWL S3 CPG vs Forest 第一场 12.16
2020/12/17 DOTA
Python编程中的文件读写及相关的文件对象方法讲解
2016/01/19 Python
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
Python实现购物车购物小程序
2018/04/18 Python
python+selenium实现QQ邮箱自动发送功能
2019/01/23 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
keras.layer.input()用法说明
2020/06/16 Python
TensorFlow-gpu和opencv安装详细教程
2020/06/30 Python
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
市场开发与营销专业求职信范文
2014/05/01 职场文书
股权转让协议书
2014/12/07 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
教学工作总结范文5篇
2019/08/19 职场文书
JavaScript 中for/of,for/in 的详细介绍
2021/11/17 Javascript