<?php
namespace App\EventListener\ForceRoute;
use App\Settings\SettingsManager;
use App\Settings\SettingsManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
class DisclaimerForceRouteListener extends AbstractForceRouteListener{
const DISCLAIMER_COOKIE_NAME = 'disclaimer_cookie';
const REFERER_VARIABLE_NAME = 'referer';
private SettingsManagerInterface $settingsManager;
public function __construct(
RouterInterface $router,
TokenStorageInterface $tokenStorage,
AuthorizationCheckerInterface $authorizationChecker,
string $environment,
SettingsManagerInterface $settingsManager
){
parent::__construct($router, $tokenStorage, $authorizationChecker, $environment);
$this->settingsManager = $settingsManager;
}
public function getRouteToForce(): string
{
return 'disclaimer';
}
public function getRouteParametersToForce(): array
{
$request = $this->event->getRequest();
return [
'referer' => $request->getRequestUri()
];
}
public function getRoutes(): array
{
return [
'contact',
'core_page_view',
];
}
public function mustForceRoute(Request $request): bool{
// Force the disclaimer display if the disclaimer toggle setting is on and if the user did not accept it within the last expiration period
return
$this->settingsManager->getValue(SettingsManager::DISCLAIMER_COOKIE_TOGGLE) == true// Settings saved as string TODO unsafe maybe ?
&& $request->cookies->has(self::DISCLAIMER_COOKIE_NAME) === false
;
}
}