namespace Rapsys\AirBundle\Security;
use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Translation\TranslatorInterface;
use Twig\Environment;
//Config array
protected $config;
- //Translator instance
- protected $translator;
+ //Context array
+ protected $context;
//Environment instance
protected $environment;
+ //Translator instance
+ protected $translator;
+
/**
* {@inheritdoc}
*/
- public function __construct(ContainerInterface $container, TranslatorInterface $translator, Environment $environment) {
+ #public function __construct(ContainerInterface $container, Environment $environment, RouterInterface $router, TranslatorInterface $translator, string $alias = 'rapsys_air') {
+ public function __construct(ContainerInterface $container, Environment $environment, RouterInterface $router, RequestStack $requestStack, TranslatorInterface $translator, string $alias = 'rapsys_air') {
//Retrieve config
- $this->config = $container->getParameter($this->getAlias());
+ $this->config = $container->getParameter($alias);
//Set the translator
$this->translator = $translator;
//Set the environment
$this->environment = $environment;
+
+ //Set the context
+ $this->context = [
+ 'copy' => [
+ 'by' => $translator->trans($this->config['copy']['by']),
+ 'link' => $this->config['copy']['link'],
+ 'long' => $translator->trans($this->config['copy']['long']),
+ 'short' => $translator->trans($this->config['copy']['short']),
+ 'title' => $this->config['copy']['title']
+ ],
+ 'site' => [
+ 'ico' => $this->config['site']['ico'],
+ 'logo' => $this->config['site']['logo'],
+ 'png' => $this->config['site']['png'],
+ 'svg' => $this->config['site']['svg'],
+ 'title' => $translator->trans($this->config['site']['title']),
+ 'url' => $router->generate($this->config['site']['url']),
+ ],
+ 'canonical' => null,
+ 'alternates' => []
+ ];
+
+ //Get current locale
+ #$currentLocale = $router->getContext()->getParameters()['_locale'];
+ $currentLocale = $requestStack->getCurrentRequest()->getLocale();
+
+ //Set translator locale
+ //XXX: allow LocaleSubscriber on the fly locale change for first page
+ $this->translator->setLocale($currentLocale);
+
+ //Iterate on locales excluding current one
+ foreach($this->config['locales'] as $locale) {
+ //Set titles
+ $titles = [];
+
+ //Iterate on other locales
+ foreach(array_diff($this->config['locales'], [$locale]) as $other) {
+ $titles[$other] = $translator->trans($this->config['languages'][$locale], [], null, $other);
+ }
+
+ //Get context path
+ $path = $router->getContext()->getPathInfo();
+
+ //Retrieve route matching path
+ $route = $router->match($path);
+
+ //Get route name
+ $name = $route['_route'];
+
+ //Unset route name
+ unset($route['_route']);
+
+ //With current locale
+ if ($locale == $currentLocale) {
+ //Set locale locales context
+ $this->context['canonical'] = $router->generate($name, ['_locale' => $locale]+$route, UrlGeneratorInterface::ABSOLUTE_URL);
+ } else {
+ //Set locale locales context
+ $this->context['alternates'][] = [
+ 'lang' => $locale,
+ 'absolute' => $router->generate($name, ['_locale' => $locale]+$route, UrlGeneratorInterface::ABSOLUTE_URL),
+ 'relative' => $router->generate($name, ['_locale' => $locale]+$route),
+ 'title' => implode('/', $titles),
+ 'translated' => $translator->trans($this->config['languages'][$locale], [], null, $locale)
+ ];
+ }
+ }
}
/**
* {@inheritdoc}
*/
-#use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
- #public function login(Request $request, AuthenticationUtils $authenticationUtils) {
- public function handle(Request $request, AccessDeniedException $accessDeniedException) {
+ public function handle(Request $request, AccessDeniedException $exception) {
//Set section
$section = $this->translator->trans('Access denied');
$title = $section.' - '.$this->translator->trans($this->config['site']['title']);
//Set message
- $message = $this->translator->trans($accessDeniedException->getMessage());
+ //XXX: we assume that it's already translated
+ $message = $exception->getMessage();
//Render template
return new Response(
$this->environment->render(
'@RapsysAir/security/denied.html.twig',
- ['title' => $title, 'section' => $section, 'message' => $message]
+ [
+ 'title' => $title,
+ 'section' => $section,
+ 'message' => $message
+ ]+$this->context
),
403
);
}
-
- /**
- * {@inheritdoc}
- */
- public function getAlias() {
- return 'rapsys_air';
- }
}