src/EventSubscriber/BikeSharingAccountSubscriber.php line 39

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Context\BikeSharingAccountContext;
  4. use App\Controller\BikeSharing\Account\BikeSharingAccountEnabledController;
  5. use App\Controller\BikeSharing\Account\LoginController;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  9. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  10. use Symfony\Component\HttpKernel\KernelEvents;
  11. use Symfony\Component\Routing\RouterInterface;
  12. class BikeSharingAccountSubscriber implements EventSubscriberInterface
  13. {
  14. /**
  15. * @var string
  16. */
  17. private $enableAccountManagementBikeSharing;
  18. /**
  19. * @var RouterInterface
  20. */
  21. private $router;
  22. /**
  23. * @var BikeSharingAccountContext
  24. */
  25. private $bikeSharingAccountContext;
  26. public function __construct(bool $enableAccountManagementBikeSharing, RouterInterface $router, BikeSharingAccountContext $bikeSharingAccountContext)
  27. {
  28. $this->enableAccountManagementBikeSharing = $enableAccountManagementBikeSharing;
  29. $this->router = $router;
  30. $this->bikeSharingAccountContext = $bikeSharingAccountContext;
  31. }
  32. public function onKernelController(ControllerEvent $event)
  33. {
  34. $controller = $event->getController();
  35. if (is_array($controller)) {
  36. $controller = $controller[0];
  37. }
  38. if ($controller instanceof BikeSharingAccountEnabledController) {
  39. if (!$this->enableAccountManagementBikeSharing) {
  40. $event->setController(function() {
  41. $url = $this->router->generate('homepage');
  42. return new RedirectResponse($url);
  43. });
  44. }
  45. $bikeSharingType = $event->getRequest()->attributes->get('bikeSharingType');
  46. try {
  47. $accountProvider = $this->bikeSharingAccountContext->handleAccountManagement($bikeSharingType);
  48. } catch (\Exception $exception){
  49. throw new NotFoundHttpException($bikeSharingType . ' is not a valid type');
  50. }
  51. if (!($controller instanceof LoginController) && !$accountProvider->isLogged()) {
  52. $event->setController(function() use ($bikeSharingType) {
  53. $url = $this->router->generate('bikesharing.login', ['bikeSharingType' => $bikeSharingType]);
  54. return new RedirectResponse($url);
  55. });
  56. }
  57. }
  58. }
  59. public static function getSubscribedEvents(): array
  60. {
  61. return [
  62. KernelEvents::CONTROLLER => 'onKernelController',
  63. ];
  64. }
  65. }