框架: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是那個模組,當然這是比較挫的實現方式,如果樓主找到了更好的解決方案,歡迎分享
錯誤顯示格式指的是什麼意思?不同的錯誤頁面?