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. $response = $action->failedAuthorization();
  20. } else {
  21. $response = $action->handle($request);
  22. }
  23. return $response instanceof Response ? $response->send() : $response;
  24. }
  25. /**
  26. * @param Request $request
  27. *
  28. * @throws Exception
  29. *
  30. * @return Action
  31. */
  32. protected function resolveActionInstance(Request $request): Action
  33. {
  34. if (! $request->has('_action')) {
  35. throw new Exception('Invalid action request.');
  36. }
  37. $actionClass = str_replace('_', '\\', $request->get('_action'));
  38. if (! class_exists($actionClass)) {
  39. throw new Exception("Action [{$actionClass}] does not exist.");
  40. }
  41. /** @var Action $action */
  42. $action = app($actionClass);
  43. if (! method_exists($action, 'handle')) {
  44. throw new Exception("Action method {$actionClass}::handle() does not exist.");
  45. }
  46. return $action;
  47. }
  48. }