src/Presentation/Web/FrontOffice/Project/Event/Listener/HandleRequestWithNoProject.php line 39

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Presentation\Web\FrontOffice\Project\Event\Listener;
  4. use App\Presentation\Web\FrontOffice\Common\Context;
  5. use App\Presentation\Web\FrontOffice\Common\Controller\AbstractFrontOfficeController;
  6. use App\Presentation\Web\FrontOffice\Project\Controller\CreateProjectAction;
  7. use App\Presentation\Web\FrontOffice\Project\Controller\SwitchDataSourceAction;
  8. use App\Presentation\Web\FrontOffice\User\Controller\UpdateUserAction;
  9. use Symfony\Component\HttpFoundation\RedirectResponse;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpKernel\Event\RequestEvent;
  12. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  13. /**
  14.  * Handles situation when context project is not set, but the requested page is supposed to be loaded with project data.
  15.  */
  16. final class HandleRequestWithNoProject
  17. {
  18.     private $urlGenerator;
  19.     private $context;
  20.     public function __construct(
  21.         UrlGeneratorInterface $urlGenerator,
  22.         Context $context
  23.     ) {
  24.         $this->urlGenerator $urlGenerator;
  25.         $this->context $context;
  26.     }
  27.     /**
  28.      * Listens for kernel.request event.
  29.      *
  30.      * @param RequestEvent $requestEvent
  31.      */
  32.     public function onKernelRequest(RequestEvent $requestEvent)
  33.     {
  34.         $this->handleNoProject($requestEvent);
  35.     }
  36.     /**
  37.      * Redirects to create project if no active project is found.
  38.      *
  39.      * @param RequestEvent $requestEvent
  40.      */
  41.     private function handleNoProject(RequestEvent $requestEvent)
  42.     {
  43.         $request $requestEvent->getRequest();
  44.         $controller $request->attributes->get('_controller');
  45.         $allowedControllers = [UpdateUserAction::class, CreateProjectAction::class, SwitchDataSourceAction::class];
  46.         if (Request::METHOD_GET === $request->getMethod() &&
  47.             !in_array($controller$allowedControllers) &&
  48.             is_subclass_of($controllerAbstractFrontOfficeController::class) &&
  49.             !$this->context->getProjectId()
  50.         ) {
  51.             $session $request->getSession();
  52.             $session->getFlashBag()->add('info''Create a project to proceed');
  53.             $requestEvent->setResponse(
  54.                 new RedirectResponse($this->urlGenerator->generate('create_project'))
  55.             );
  56.         }
  57.     }
  58. }