<?php
declare(strict_types=1);
namespace App\Controller\Front;
use App\Config\Pages;
use App\Entity\Page\Page;
use App\Entity\Page\PageTranslation;
use App\Provider\PageProviderInterface;
use App\Repository\DietRepository;
use DateTime;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\Routing\Annotation\Route;
use App\ParamConverter\RedirectParamConverter;
/**
* @Route("", name="front-")
*/
class PageController extends AbstractController
{
private array $locales = [];
public function __construct(
private ParameterBagInterface $parameterBag,
private RequestStack $session,
) {
$this->locales = $this->parameterBag->get('app.supported_locales_data');
}
/**
* @Route(
* path="/{url}",
* name="page",
* requirements={
* "_locale": "%app.supported_locales%",
* "url": "[^.]+"
* },
* methods={"GET"}
* ),
* @ParamConverter(
* converter="redirect_param_converter",
* "pageTranslation",
* options={
* "mapping": {
* "url": "url"
* }
* }
* )
*/
public function getPageAction(
Request $request,
PageTranslation $pageTranslation,
string $_locale = 'pl',
string $url = ''
): Response {
$isSlashRedirect = $request->request->get('isSlashRedirect');
if($isSlashRedirect) {
$redirectLink = $request->request->get('slashRedirectLink');
$response = $this->redirect($redirectLink, 301);
$response->setPublic();
$response->setMaxAge(0);
return $response;
}
$isRedirect = $request->request->get('isRedirect');
if ($isRedirect) {
$redirectLink = $request->request->get('redirectLink');
$response = $this->redirect($redirectLink, 301);
$response->setPublic();
$response->setMaxAge(0);
return $response;
}
$isRedirectString = $request->request->get('isRedirectString');
if ($isRedirectString) {
$redirectLink = $request->request->get('redirectLinkString');
$response = $this->redirect($redirectLink, 301);
$response->setPublic();
$response->setMaxAge(0);
return $response;
}
if ($_locale) {
if (!$locale = $this->locales[$_locale]) {
return $this->createNotFoundException("Could not find page translation for locale \"$_locale\"");
}
$this->session->getSession()->set('_locale', $_locale);
$request->setLocale($_locale);
//$request->setDefaultLocale($_locale);
}
$user = $this->getUser();
$page = $pageTranslation->getTranslatable();
if (!$page->getIsPublished() && !$user) {
throw new HttpException(404, 'This page is not available yet');
}
if ($forwardResponse = $this->getForwardResponseForPage($page, $request)) {
return $forwardResponse;
}
$templatePath = 'front/index.twig';
$viewParams = [
"entity" => $page,
"currentUrl" => [
"locale" => $request->getLocale(),
]
];
$response = $this->render($templatePath, $viewParams);
if ("GET" === $request->getMethod()) {
$response->setPublic();
$response->setExpires(new DateTime("+1 hour"));
$response->setMaxAge(3600);
}
return $response;
}
private function getForwardResponseForPage(Page $page, Request $request)
{
// $configForTypes = [
// Pages::CATEGORY => BlogController::class . "::router",
// ];
$configForSpecificPages = [
//Pages::BLOG_LIST => BlogController::class . "::router",
];
$controller = $configForSpecificPages[$page->getMigrationId()]
?? $configForTypes[$page->getType()]
?? null;
if (!$controller) {
return;
}
return $this->forward(
$controller,
[
"page" => $page,
"originalRequest" => $request,
]
);
}
}