Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 195|回复: 1

[默认分类] YII2中behavior行为的理解与使用

  [复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-3-30 09:40:30 | 显示全部楼层 |阅读模式
    YII2中的行为说白了就是对组件功能的扩展,在不改变继承关系的条件下。
    行为附加到组件后,行为将注入自已的方法和属性到组件,可以像组件访问自定义的方法和属性一样访问行为。
    注意行为是对功能的扩展,不要乱用行为,比如有一个动物类和一个人类,他们各自有自已的名称,身高,体重,这些是属性。
    他们都会跑,这个时候我们就可以抽象出来做成一个跑的行为,根据不同需求来扩展他们。
    这里我们有两个控制器一个GoodsController,一个OrderController,他们都接收请求,返回数据给客户端,不过有的需要返回json,有的需要返回xml。
    那么我们就创建一个返回数据行为来扩展这两个控制器。
    我们在项目目录下创建common目录,并创建ReturnBehavior.php,代码如下:

    1. <?php
    2. namespace app\common;
    3. use YII;
    4. use yii\base\Behavior;
    5. use yii\web\Controller;
    6. use yii\web\Response;
    7. //必须继承自yii\base\Behavior
    8. class ReturnBehavior extends Behavior
    9. {
    10.     //返回类型,通过控制器里的behaviors()配置参数获取值
    11.     public $return_type = "";
    12.     //让行为响应组件的事件触发
    13.     public function events()
    14.     {
    15.         return [
    16.             //控制器方法执行后触发事件,调用returnData函数
    17.             Controller::EVENT_AFTER_ACTION => "returnData",
    18.         ];
    19.     }
    20.     //返回数据
    21.     public function returnData()
    22.     {
    23.         switch ($this->return_type) {
    24.             case "json":
    25.                 YII::$app->response->format = Response::FORMAT_JSON;
    26.                 break;
    27.             case "xml":
    28.                 YII::$app->response->format = Response::FORMAT_XML;
    29.                 break;
    30.             case "html":
    31.                 YII::$app->response->format = Response::FORMAT_HTML;
    32.                 break;
    33.             default :
    34.                 break;
    35.         }
    36.     }
    37.     //定义方法
    38.     public function test() {
    39.         echo "returnBehavior test ...";
    40.     }
    41. }
    复制代码


    然后我们在两个控制器中配置behaviors()来使用行为:
    GoodsController.php代码如下:

    1. <?php
    2. namespace app\controllers;
    3. use YII;
    4. use app\common\ReturnBehavior;
    5. use yii\web\Controller;
    6. //想要使用行为,必须是component或是其子类
    7. //yii\web\Controller继承自component,所以可以使用
    8. class GoodsController extends Controller
    9. {
    10.     //配置控制器需要使用的行为
    11.     public function behaviors()
    12.     {
    13.         return [
    14.             "returnBehavior" => [
    15.                 "class" => ReturnBehavior::className(),
    16.                 "return_type" => "json",
    17.             ],
    18.         ];
    19.     }
    20.     //获取商品列表
    21.     public function actionGetGoodsList()
    22.     {
    23.         return [
    24.             ["id" => 1, "name" => "商品1"],
    25.             ["id" => 2, "name" => "商品2"],
    26.         ];
    27.     }
    28.     public function actionIndex()
    29.     {
    30.         //控制器调用行为中的方法
    31.         $this->getBehavior("returnBehavior")->test();
    32.         //注意这里,因为使用了行为,方法执行后会设置返回内容为xml,我们重新设置为html
    33.         $this->getBehavior("returnBehavior")->return_type = "html";
    34.     }
    35. }
    复制代码


    OrderController.php代码如下:

    1. <?php
    2. namespace app\controllers;
    3. use YII;
    4. use app\common\ReturnBehavior;
    5. use yii\web\Controller;
    6. //想要使用行为,必须是component或是其子类
    7. //yii\web\Controller继承自component,所以可以使用
    8. class OrderController extends Controller
    9. {
    10.     //配置控制器需要使用的行为
    11.     public function behaviors()
    12.     {
    13.         return [
    14.             "returnBehavior" => [
    15.                 "class" => ReturnBehavior::className(),
    16.                 "return_type" => "xml",
    17.             ],
    18.         ];
    19.     }
    20.     //获取商品列表
    21.     public function actionGetOrderList()
    22.     {
    23.         return [
    24.             ["id" => 1, "name" => "订单1"],
    25.             ["id" => 2, "name" => "订单2"],
    26.         ];
    27.     }
    28.     public function actionIndex()
    29.     {
    30.         //控制器调用行为中的方法
    31.         $this->getBehavior("returnBehavior")->test();
    32.         //注意这里,因为使用了行为,方法执行后会设置返回内容为xml,我们重新设置为html
    33.         $this->getBehavior("returnBehavior")->return_type = "html";
    34.     }
    35. }
    复制代码


    这个时候我们在地址栏访问/goods/get-goods-list和/order/get-order-list,结果如下:

    然后我们访问/goods/index和/order/index,行为方法成功调用,结果如下:
    回复

    使用道具 举报

    该用户从未签到

    发表于 2018-4-12 14:09:14 | 显示全部楼层
    谢谢!楼主提供!好样的












    兼职托管
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-1 02:21 , Processed in 0.363296 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表