<?php namespace Rapsys\AirBundle\Security; use Symfony\Component\HttpFoundation\Request; 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\RouterInterface; use Symfony\Component\Translation\TranslatorInterface; use Twig\Environment; class AccessDeniedHandler implements AccessDeniedHandlerInterface { //Config array protected $config; //Context array protected $context; //Environment instance protected $environment; //Translator instance protected $translator; /** * {@inheritdoc} */ public function __construct(ContainerInterface $container, Environment $environment, RouterInterface $router, TranslatorInterface $translator, string $alias = 'rapsys_air') { //Retrieve config $this->config = $container->getParameter($alias); //Set the translator $this->translator = $translator; //Set the environment $this->environment = $environment; //Set the context $this->context = [ 'copy_long' => $translator->trans($this->config['copy']['long']), 'copy_short' => $translator->trans($this->config['copy']['short']), 'site_ico' => $this->config['site']['ico'], 'site_logo' => $this->config['site']['logo'], 'site_png' => $this->config['site']['png'], 'site_svg' => $this->config['site']['svg'], 'site_title' => $translator->trans($this->config['site']['title']), 'site_url' => $router->generate($this->config['site']['url']) ]; } /** * {@inheritdoc} */ public function handle(Request $request, AccessDeniedException $exception) { //Set section $section = $this->translator->trans('Access denied'); //Set title $title = $section.' - '.$this->translator->trans($this->config['site']['title']); //Set message //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 ]+$this->context ), 403 ); } }