ApiException.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <?php
  2. namespace App\Exceptions;
  3. class ApiException extends \Exception
  4. {
  5. /**
  6. * 错误信息参数
  7. * @var array
  8. */
  9. protected $params = [];
  10. /**
  11. * 携带的参数
  12. * @var array
  13. */
  14. protected $data = [];
  15. /** 处理异常错误
  16. * @param string $id 语言包中的key or 错误代码
  17. * @param null $message 错误信息 or 替换参数
  18. * @param array $params 替换参数 or 附加数据
  19. * @param int $code 错误代码 or 无用
  20. * @param null $locale 语言 or 无用
  21. * @param array $data or 无用
  22. */
  23. public function __construct($id, $message = null, $params = [], $code = 0, $locale = null, $data = [])
  24. {
  25. $locale = $locale ?: app('translator')->getLocale();
  26. $this->params = $params;
  27. $this->data = $data;
  28. if (is_numeric($id)) {
  29. //兼容原本的调用方式和顺序
  30. //$id, $params=[], $data=[], $message = null
  31. $this->params = $message ? (array)$message : [];
  32. $this->data = $params;
  33. if (!$code) {
  34. //根据中间件设置的语言处理多语言消息
  35. $message = $this->parseMessage($id);
  36. } else {
  37. $message = $code;
  38. }
  39. $code = $id;
  40. } else {
  41. $message = $this->parseNewMessage($id, $message, $code, $locale);
  42. }
  43. parent::__construct($message, $code, null);
  44. }
  45. /**
  46. * 解析错误信息
  47. * @param $code
  48. * @return string
  49. */
  50. protected function parseMessage($code)
  51. {
  52. $errors = config('error');
  53. if (!isset($errors[$code])) {
  54. return '服务器繁忙,请稍候重试.';
  55. }
  56. $message = $errors[$code];
  57. if (!empty($this->params)) {
  58. foreach ($this->params as $key => $item) {
  59. $message = str_replace('{' . $key . '}', $item, $message);
  60. }
  61. }
  62. return $message;
  63. }
  64. /**
  65. * 获取参数数据
  66. * @return array
  67. */
  68. public function getData()
  69. {
  70. return $this->data;
  71. }
  72. /**
  73. * 解析语言包文件
  74. * @param $id
  75. * @param $message
  76. * @param $code
  77. * @param null $locale
  78. * @return array
  79. */
  80. public function parseNewMessage($id, $message, &$code, $locale = null)
  81. {
  82. $code = -1;
  83. if (is_null($id)) {
  84. return $message ?: $id;
  85. }
  86. $keys = explode('.', $id);
  87. $this->getLang($keys[0], $locale);
  88. if (!$this->langs[$locale][$keys[0]]) {
  89. return $message ?: $id;
  90. }
  91. $data = isset($this->langs[$locale][$keys[0]][$keys[1]]) ? $this->langs[$locale][$keys[0]][$keys[1]] : [];
  92. if ($data) {
  93. if (is_array($data)) {
  94. $code = $data[0];
  95. $message = $data[1];
  96. } else {
  97. $message = $data;
  98. }
  99. } else {
  100. $message = $message ?: $id;
  101. }
  102. if (!empty($this->params)) {
  103. foreach ($this->params as $key => $item) {
  104. $message = str_replace('{' . $key . '}', $item, $message);
  105. }
  106. }
  107. return $message;
  108. }
  109. /*
  110. * 取语言包文件
  111. */
  112. public function getLang($key, $locale = 'zh-cn')
  113. {
  114. $path = 'lang/' . $locale . '/' . $key;
  115. if (!isset($this->langs[$locale]) || !isset($this->langs[$locale][$key])) {
  116. $this->langs[$locale][$key] = include resource_path($path . '.php');
  117. }
  118. }
  119. }