<?php
namespace App\Controller;
use App\Entity\Language;
use App\Entity\SectionAcl;
use App\Entity\Slug;
use App\Service\RouteGenerator;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Twig\Environment;
class FrontController extends AbstractController
{
/**
* @var EntityManagerInterface
*/
private $em;
/**
* FrontController constructor.
* @param RouteGenerator $generator
* @param EntityManagerInterface $manager
*/
public function __construct(EntityManagerInterface $manager, private Environment $twig)
{
$this->em = $manager;
}
/**
* @Route("/", name="default")
*
* @return Response
*/
public function redirectAction(Request $request): Response
{
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && (strpos(@$_SERVER['HTTP_REFERER'], $_SERVER['APP_DOMAIN']) === false)) {
// break up string into pieces (languages and q factors)
preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);
if (count($lang_parse[1])) {
// create a list like "en" => 0.8
$langs = array_combine($lang_parse[1], $lang_parse[4]);
// set default to 1 for any without q factor
foreach ($langs as $lang => $val) {
if (strlen($lang) > 2) {
unset($langs[$lang]);
$lang = substr($lang, 0, 2);
}
if (empty($langs[$lang]) || !$langs[$lang])
$langs[$lang] = 1;
}
// sort list based on value
arsort($langs, SORT_NUMERIC);
$dbLangs = [];
foreach ($this->em->getRepository(Language::class)->findAll() as $language) {
$dbLangs[] = $language->getCode();
}
foreach (array_keys($langs) as $lang) {
if (in_array($lang, $dbLangs)) {
return $this->redirectToRoute('security_home', array_merge(['_locale' => $lang], $request->query->all()));
}
}
}
}
return $this->redirectToRoute('security_home', $request->query->all());
}
// /**
// * This route ensures all GET requests (e.g. sections urls) end with a slash
// *
// * @Route("/{path}", name="add_trailing_slash", requirements={"path"="[^\/]$"}, methods={"GET"})
// *
// * @param Request $request
// * @return Response
// */
// public function addTrailingSlashAction(Request $request): Response
// {
// $pathInfo = $request->getPathInfo();
// $requestUri = $request->getRequestUri();
//
// $url = str_replace($pathInfo, trim($pathInfo).'/', $requestUri);
//
// return $this->redirect($url, 301);
// }
/**
* The main frontend route that ensures all the sections are displayed properly
* base on their Url
*
* @Route("{path}", name="front", requirements={"path"=".*"}, defaults={"path" = ""})
*
* @param Request $request
* @param Slug|null $slug
* @return Response
*/
public function frontAction(): Response
{
return new Response($this->twig->render('404.html.twig'), 404);
}
}