Yii2開發Restful API的時候如何為不同的Module顯示各自的錯誤格式?

WBOY
發布: 2016-08-04 09:19:47
原創
976 人瀏覽過

框架: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還有什麼實作方式呢?

可以做到。

在每個模組的 Module.php 內的 Module::init() 方法 給 Response::EVENT_BEFORE_SEND 綁定handler即可。

也需要在 Module.php 中綁定因 module 而異的 [errorHandler].

具體參考 module 和 event 文件

Yii2應該是不支援的,如果要做到這個事情,可以考慮在error handler中去分析url是那個模組,當然這是比較挫的實現方式,如果樓主找到了更好的解決方案,歡迎分享

錯誤顯示格式指的是什麼意思?不同的錯誤頁面?

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板