<?php
namespace App\EventSubscriber;
use App\Context\BikeSharingAccountContext;
use App\Controller\BikeSharing\Account\BikeSharingAccountEnabledController;
use App\Controller\BikeSharing\Account\LoginController;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RouterInterface;
class BikeSharingAccountSubscriber implements EventSubscriberInterface
{
/**
* @var string
*/
private $enableAccountManagementBikeSharing;
/**
* @var RouterInterface
*/
private $router;
/**
* @var BikeSharingAccountContext
*/
private $bikeSharingAccountContext;
public function __construct(bool $enableAccountManagementBikeSharing, RouterInterface $router, BikeSharingAccountContext $bikeSharingAccountContext)
{
$this->enableAccountManagementBikeSharing = $enableAccountManagementBikeSharing;
$this->router = $router;
$this->bikeSharingAccountContext = $bikeSharingAccountContext;
}
public function onKernelController(ControllerEvent $event)
{
$controller = $event->getController();
if (is_array($controller)) {
$controller = $controller[0];
}
if ($controller instanceof BikeSharingAccountEnabledController) {
if (!$this->enableAccountManagementBikeSharing) {
$event->setController(function() {
$url = $this->router->generate('homepage');
return new RedirectResponse($url);
});
}
$bikeSharingType = $event->getRequest()->attributes->get('bikeSharingType');
try {
$accountProvider = $this->bikeSharingAccountContext->handleAccountManagement($bikeSharingType);
} catch (\Exception $exception){
throw new NotFoundHttpException($bikeSharingType . ' is not a valid type');
}
if (!($controller instanceof LoginController) && !$accountProvider->isLogged()) {
$event->setController(function() use ($bikeSharingType) {
$url = $this->router->generate('bikesharing.login', ['bikeSharingType' => $bikeSharingType]);
return new RedirectResponse($url);
});
}
}
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
];
}
}