Yii2开发Restful API的时候如何为不同的Module显示各自的错误格式?

php中文网
发布: 2016-08-04 09:19:47
原创
1247人浏览过

框架:yii2 adv
目录结构如下

<code>api/
    models/
    web/
    modules/
        v1/
            controllers/
            ...
        v2/
            controllers/
            ...
    config/
        main.php
        ...</code>
登录后复制

现在打算针对v2版本的Api使用不同的错误显示格式, 所以我按照文档上说明的对response组件添加了on beforeSend事件, 但是实践中发现这样设置事件只能够对应用组件起作用, 对于Module的组件无法触发事件.
config/main.php代码如下:

<code>return [
    'id' => 'app-api',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log',],
    'modules' => [
        'v1' => [
            'class' => 'api\modules\v1\Module',
            'basePath' => '@app/modules/v1',
            'components' => [
            ]
        ],
        'v2' => [
            'class' => 'api\modules\v2\Module',
            'basePath' => '@app/modules/v2',
            'components' => [
                'response' => [
                    'class' => \yii\web\Response::class,
                    'on beforeSend' => function ($event) {
                        /** @var \yii\web\Response $res */
                        $res = $event->sender;
                        if (!$res->isSuccessful) {
//                            do something here...
//                            ...
                        }
                    }
                ],
            ],
        ]
    ],
    ...</code>
登录后复制

如果直接采用文档http://www.yiiframework.com/d...中的方法会同时对v1和v2两个模块起作用, 导致v1正在使用的接口与App不兼容.
如果只打算对单独的Module设置Response还有什么实现方式呢?

回复内容:

框架:yii2 adv
目录结构如下

<code>api/
    models/
    web/
    modules/
        v1/
            controllers/
            ...
        v2/
            controllers/
            ...
    config/
        main.php
        ...</code>
登录后复制

现在打算针对v2版本的Api使用不同的错误显示格式, 所以我按照文档上说明的对response组件添加了on beforeSend事件, 但是实践中发现这样设置事件只能够对应用组件起作用, 对于Module的组件无法触发事件.
config/main.php代码如下:

<code>return [
    'id' => 'app-api',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log',],
    'modules' => [
        'v1' => [
            'class' => 'api\modules\v1\Module',
            'basePath' => '@app/modules/v1',
            'components' => [
            ]
        ],
        'v2' => [
            'class' => 'api\modules\v2\Module',
            'basePath' => '@app/modules/v2',
            'components' => [
                'response' => [
                    'class' => \yii\web\Response::class,
                    'on beforeSend' => function ($event) {
                        /** @var \yii\web\Response $res */
                        $res = $event->sender;
                        if (!$res->isSuccessful) {
//                            do something here...
//                            ...
                        }
                    }
                ],
            ],
        ]
    ],
    ...</code>
登录后复制

如果直接采用文档http://www.yiiframework.com/d...中的方法会同时对v1和v2两个模块起作用, 导致v1正在使用的接口与App不兼容.
如果只打算对单独的Module设置Response还有什么实现方式呢?

可以做到。

芦笋演示
芦笋演示

一键出成片的录屏演示软件,专为制作产品演示、教学课程和使用教程而设计。

芦笋演示 34
查看详情 芦笋演示

在每个模块的 Module.php 内的 Module::init() 方法中 给 Response::EVENT_BEFORE_SEND 绑定handler即可。

还需要在 Module.php 中绑定因 module 而异的 [errorHandler].

具体参考 module 和 event 文档

Yii2应该是不支持的,如果要做到这个事情,可以考虑在error handler中去分析url是那个模块,当然这是比较挫的实现方式,如果楼主找到了更好的解决方案,欢迎分享

错误显示格式指的是什么意思?不同的错误页面?
相关标签:
php
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号