src/Listener/DtvRequestListener.php line 32

Open in your IDE?
  1. <?php
  2. namespace App\Listener;
  3. use App\Entity\User;
  4. use Symfony\Component\HttpFoundation\RedirectResponse;
  5. use Symfony\Component\HttpKernel\Event\RequestEvent;
  6. use Symfony\Component\Routing\RouterInterface;
  7. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  8. class DtvRequestListener
  9. {
  10. private RouterInterface $router;
  11. private TokenStorageInterface $tokenStorage;
  12. /**
  13. * @param RouterInterface $router
  14. * @param TokenStorageInterface $tokenStorage
  15. */
  16. public function __construct( RouterInterface $router, TokenStorageInterface $tokenStorage )
  17. {
  18. $this->router = $router;
  19. $this->tokenStorage = $tokenStorage;
  20. }
  21. /**
  22. * @param RequestEvent $event
  23. *
  24. * @return void
  25. */
  26. public function onKernelRequest( RequestEvent $event ): void
  27. {
  28. $currentRoute = $event->getRequest()->get( '_route' );
  29. if($currentRoute && str_contains($currentRoute, 'dtv_back_platform'))
  30. {
  31. $session = $event->getRequest()->getSession();
  32. $project = $session->get( 'project' );
  33. $safeRoute = [
  34. 'dtv_back_platform_project_list',
  35. 'dtv_back_platform_users',
  36. 'dtv_back_platform_settings_delete',
  37. 'app_login',
  38. 'dtv_back_platform_project_log_show',
  39. 'dtv_back_platform_project_cache_clear',
  40. 'dtv_back_platform_project_catalogue_renew',
  41. 'dtv_back_platform_project_log_clear',
  42. ];
  43. $routeOk = array_filter( $safeRoute, static function ( $v ) use ( $currentRoute ) {
  44. return str_contains( $currentRoute, $v );
  45. } );
  46. // redirection si pas de project sélectionné
  47. if ( $project === NULL && count( $routeOk ) === 0 ) {
  48. $url = $this->router->generate( 'dtv_back_platform_project_list' );
  49. $response = new RedirectResponse( $url );
  50. $event->setResponse( $response );
  51. }
  52. // redirection si viewOnly, que le user n'est pas dev et qu'il a une requete sur les pages de design et de contenu
  53. if ( !is_null( $this->tokenStorage->getToken() ) ) {
  54. /** @var User $user */
  55. $user = $this->tokenStorage->getToken()->getUser();
  56. // dtv_back_platform_content
  57. // dtv_back_platform_design
  58. if ( $project !== NULL &&
  59. $project->isViewOnly() &&
  60. !$user->isDeveloper() &&
  61. ( str_contains( $currentRoute, 'dtv_back_platform_design' ) or str_contains( $currentRoute, 'dtv_back_platform_content' ) )
  62. ) {
  63. $url = $this->router->generate( 'dtv_back_platform_project_list' );
  64. $response = new RedirectResponse( $url );
  65. $event->setResponse( $response );
  66. }
  67. }
  68. }
  69. }
  70. }