BeforeSend.php 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. namespace api\behaviors;
  3. use Yii;
  4. use yii\base\Behavior;
  5. use yii\web\Response;
  6. /**
  7. * Class BeforeSend
  8. * @package api\behaviors
  9. * @author jianyan74 <751393839@qq.com>
  10. */
  11. class BeforeSend extends Behavior
  12. {
  13. /**
  14. * {@inheritdoc}
  15. */
  16. public function events()
  17. {
  18. return [
  19. 'beforeSend' => 'beforeSend',
  20. ];
  21. }
  22. /**
  23. * 格式化返回
  24. *
  25. * @param $event
  26. * @throws \yii\base\InvalidConfigException
  27. */
  28. public function beforeSend($event)
  29. {
  30. if (YII_DEBUG && isset(Yii::$app->controller->module->id) && Yii::$app->controller->module->id === "debug") {
  31. return;
  32. }
  33. // 不进行格式化出处理
  34. if (Yii::$app->params['triggerBeforeSend'] == false) {
  35. $response = $event->sender;
  36. $response->format = Response::FORMAT_HTML;
  37. $response->statusCode = 200;
  38. return;
  39. }
  40. $response = $event->sender;
  41. $response->data = [
  42. 'code' => $response->statusCode,
  43. 'message' => $response->statusText,
  44. 'data' => $response->data,
  45. 'timestamp' => time(),
  46. ];
  47. // 记录日志
  48. $errData = Yii::$app->services->log->record($response, true);
  49. // 格式化报错输入格式
  50. if ($response->statusCode >= 500) {
  51. $response->data['data'] = YII_DEBUG ? $errData : '服务器打瞌睡了~';
  52. }
  53. // 提取系统 300-499 的报错信息
  54. if ($response->statusCode >= 300 && $response->statusCode <= 499) {
  55. if (is_array($response->statusText)) {
  56. $response->data['message'] = $errData['errorMessage'];
  57. }
  58. if (isset($errData['errorMessage'])) {
  59. $response->data['message'] = $errData['errorMessage'];
  60. }
  61. $response->data['message'] == $response->data['data'] && $response->data['data'] = [];
  62. }
  63. // 加入ip黑名单
  64. // $response->statusCode == 429 && Yii::$app->services->ipBlacklist->create(Yii::$app->request->userIP, '请求频率过高');
  65. $response->format = Response::FORMAT_JSON;
  66. // 考虑到了某些前端必须返回成功操作,所以这里可以设置为都返回200的状态码
  67. $response->statusCode = 200;
  68. }
  69. }
粤ICP备19079148号