<?php
namespace App\EventSubscriber;
use App\Entity\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Core\Security;
/**
* src: https://symfony.com/doc/current/event_dispatcher.html#event-dispatcher-before-after-filters
*
* L'administrateur, à la création d'un nouvel utilisateur, peut créer un mot de passe,
* nous allons obliger l'utilisateur à modifier son mot de passe
*/
class AccessCheckSubscriber implements EventSubscriberInterface
{
private $security;
private $urlGeneratorInterface;
public function __construct(
Security $security,
UrlGeneratorInterface $urlGeneratorInterface
) {
$this->security = $security;
$this->urlGeneratorInterface = $urlGeneratorInterface;
}
public function onKernelController(ControllerEvent $event): void
{
$controller = $event->getController();
// when a controller class defines multiple action methods, the controller
// is returned as [$controllerInstance, 'methodName']
if (is_array($controller))
{
$controller = $controller[0];
}
$user = $this->security->getUser();
/**
* Nous allons ecouter chaque request donc s'assurer d'exclure '/entreprise/esi/all' et '/utilisateur/edit-password' pour eviter une boucle
*/
$uriRequest = $event->getRequest()->getRequestUri();
if ($user instanceof User && !empty($user->getFournisseur()) )
{
$data = [
'gs/creneaux',
'gs/fournisseurs',
'gs/parametrage',
'gs/conditions/mentions/legales',
'gs/products',
'gs/clients',
'gs/conversations',
'gs/remises',
'gs/services',
'gs/pays/livraison',
'gs/frais',
'gs/zone_livraison',
'gs/categories',
'gs/attributs',
'gs/stocks',
'gs/unites',
'gs/marques',
'gs/genres',
'gs/classe-regroupements',
'gs/seuils-commandes',
'gs/search_pays',
'gs/commandes_product/delete/photo'
];
foreach ($data as $uri)
{
if (strpos($uriRequest, $uri) !== false)
{
$event->stopPropagation();
$event->setController(function()
{
$url = $this->urlGeneratorInterface->generate('app_gs_home');
return new RedirectResponse($url);
});
break;
}
}
}
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
];
}
}