HandleActionController.php 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <?php
  2. namespace Dcat\Admin\Controllers;
  3. use Dcat\Admin\Actions\Action;
  4. use Dcat\Admin\Actions\Response;
  5. use Exception;
  6. use Illuminate\Http\Request;
  7. class HandleActionController
  8. {
  9. /**
  10. * @param Request $request
  11. *
  12. * @return $this|\Illuminate\Http\JsonResponse
  13. */
  14. public function handle(Request $request)
  15. {
  16. $action = $this->resolveActionInstance($request);
  17. $action->setKey($request->get('_key'));
  18. if (! $action->passesAuthorization()) {
  19. return $action->failedAuthorization();
  20. }
  21. $response = $action->handle($request);
  22. return $response instanceof Response ? $response->send() : $response;
  23. }
  24. /**
  25. * @param Request $request
  26. *
  27. * @throws Exception
  28. *
  29. * @return Action
  30. */
  31. protected function resolveActionInstance(Request $request): Action
  32. {
  33. if (! $request->has('_action')) {
  34. throw new Exception('Invalid action request.');
  35. }
  36. $actionClass = str_replace('_', '\\', $request->get('_action'));
  37. if (! class_exists($actionClass)) {
  38. throw new Exception("Action [{$actionClass}] does not exist.");
  39. }
  40. /** @var Action $action */
  41. $action = app($actionClass);
  42. if (! method_exists($action, 'handle')) {
  43. throw new Exception("Action method {$actionClass}::handle() does not exist.");
  44. }
  45. return $action;
  46. }
  47. }