Validate.php 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <?php
  2. namespace app\middleware;
  3. use think\exception\ValidateException;
  4. use OSS\Core\OssException;
  5. use OSS\OssClient;
  6. use think\facade\Log;
  7. class Validate
  8. {
  9. /**
  10. * 处理请求
  11. * @param \think\Request $request
  12. * @param \Closure $next
  13. * @return Response
  14. */
  15. public function handle($request, \Closure $next)
  16. {
  17. $controller = $request->controller();
  18. $action = $request->action();
  19. $appName = app()->http->getName();
  20. trace($appName.'\\controller\\'.$controller.'@'.$action, 'log');
  21. $validateClass = 'app\\' . $appName . '\\validate' . '\\' . ucfirst($controller);
  22. $param = $request->isPost() ? $request->post() : $request->get();
  23. trace('post:'.json_encode($request->post()), 'log');
  24. trace('get:'.json_encode($request->get()), 'log');
  25. if (class_exists($validateClass)) {
  26. $validateObj = validate($validateClass);
  27. if ($validateObj->hasScene($action)) {
  28. try {
  29. $validateObj->scene($action)->check($param);
  30. } catch (ValidateException $e) {
  31. // 验证失败 输出错误信息
  32. return json(['code' => 1, 'msg' => $e->getError()]);
  33. }
  34. }
  35. }
  36. // 如果有上传图片,先将地址传到控制器
  37. $files = $_FILES;
  38. $method = strtolower($request->method(true));
  39. $requestMethond = 'with' . ucfirst($method);
  40. $imgUrlOss = [];
  41. if (!empty($files)) {
  42. foreach ($files as $key => $f) {
  43. if (!empty($f['name'])) {
  44. if (is_array($f['name'])) {
  45. $p = [];
  46. foreach ($f['name'] as $i => $name) {
  47. $url = $controller . '/' . uniqid() . '.' . pathinfo($name, PATHINFO_EXTENSION);
  48. $imgUrlOss[] = ['tmp_name' => $f['tmp_name'][$i], 'name' => $url];
  49. $p[] = $url;
  50. }
  51. } else {
  52. $p = $controller . '/' . uniqid() . '.' . pathinfo($f['name'], PATHINFO_EXTENSION);
  53. $imgUrlOss[] = ['tmp_name' => $f['tmp_name'], 'name' => $p];
  54. }
  55. if (method_exists($request, $requestMethond)) {
  56. $request->$requestMethond(array_merge($request->$method(), [$key => $p]));
  57. }
  58. }
  59. }
  60. }
  61. // 恢复内容设置到变量中
  62. $response = $next($request);
  63. // 将上传到图片保存
  64. if (!empty($imgUrlOss)) {
  65. $accessKeyId = config('app.ali_oss_access_key_id');
  66. $accessKeySecret = config('app.ali_oss_access_key_secret');
  67. $endpoint = config('app.ali_oss_end_point');
  68. $bucket = config('app.ali_oss_bucket');
  69. $oss = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  70. try {
  71. foreach ($imgUrlOss as $key => $v) {
  72. $oss->uploadFile($bucket, $v['name'], $v['tmp_name']);
  73. }
  74. } catch (OssException $e) {
  75. Log::record('文件上传失败,error:' . $e->getErrorCode(), 'error');
  76. return json(['code' => 1, 'msg' => $e->getErrorMessage()]);
  77. }
  78. }
  79. return $response;
  80. }
  81. }