ResBeforeSendBehavior.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: admin
  5. * Date: 2019/11/20
  6. * Time: 0:31
  7. */
  8. namespace api\components;
  9. use Yii;
  10. use yii\web\Response;
  11. use yii\base\Behavior;
  12. class ResBeforeSendBehavior extends Behavior{
  13. public $defaultCode = 500;
  14. public $defaultMsg = 'error';
  15. // 重载events() 使得在事件触发时,调用行为中的一些方法
  16. public function events() {
  17. // 在 EVENT_BEFORE_SEND 事件触发时,调用成员函数 beforeSend
  18. return [
  19. Response::EVENT_BEFORE_SEND => 'beforeSend',
  20. ];
  21. }
  22. // 注意 beforeSend 是行为的成员函数,而不是绑定的类的成员函数。
  23. // 还要注意,这个函数的签名,要满足事件 handler 的要求。
  24. public function beforeSend($event)
  25. {
  26. try {
  27. $response = $event->sender;
  28. if($response->data === null){
  29. $response->data = [
  30. 'code' => $this->defaultCode,
  31. 'msg' => $this->defaultMsg,
  32. ];
  33. } elseif(!$response->isSuccessful) {
  34. $exception = Yii::$app->getErrorHandler()->exception;
  35. if(is_object($exception) && !$exception instanceof yii\web\HttpException){
  36. throw $exception;
  37. } else {
  38. $rData = $response->data;
  39. $response->data = [
  40. 'code' => empty($rData['status']) ? $this->defaultCode : $rData['status'],
  41. 'msg' => empty($rData['message']) ? $this->defaultMsg : $rData['message'],
  42. ];
  43. }
  44. } else {
  45. /**
  46. * $response->isSuccessful 表示是否会抛出异常
  47. * 值为 true, 代表返回数据正常,没有抛出异常
  48. */
  49. $rData = $response->data;
  50. $response->data = [
  51. 'code' => isset($rData['error_code']) ? $rData['error_code'] : 0,
  52. 'msg' => isset($rData['res_msg']) ? $rData['res_msg'] : $rData,
  53. ];
  54. $response->statusCode = 200;
  55. }
  56. } catch (\Exception $e) {
  57. $response->data = [
  58. 'code' => $this->defaultCode,
  59. 'msg' => $this->defaultMsg,
  60. ];
  61. }
  62. return true;
  63. }
  64. }