<?php
namespace AWCmsBundle\EventListener;
use AWCmsBundle\Manager\RedirectionManager;
use AWCmsBundle\Manager\SiteManager;
use AWCmsBundle\Manager\SlugManager;
use AWCmsBundle\Service\ElasticSearchHandler;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\Event\ViewEvent;
/**
* Allow to change status code of response if status_code parameters is set
*/
class ResponseListener
{
private SessionInterface $session;
private ElasticSearchHandler $elasticSearchHandler;
private SiteManager $siteManager;
private SlugManager $slugManager;
private RedirectionManager $redirectionManager;
public function __construct(
SessionInterface $session,
ElasticSearchHandler $elasticSearchHandler,
SiteManager $siteManager,
SlugManager $slugManager,
RedirectionManager $redirectionManager
)
{
$this->session = $session;
$this->elasticSearchHandler = $elasticSearchHandler;
$this->siteManager = $siteManager;
$this->slugManager = $slugManager;
$this->redirectionManager = $redirectionManager;
}
public function onKernelView(ViewEvent $event)
{
$request = $event->getRequest();
$parameters = $event->getControllerResult();
if (is_array($parameters) && isset($parameters['status_code']) and is_int($parameters['status_code'])) {
$request->attributes->set('status_code', $parameters['status_code']);
}
}
public function onKernelResponse(ResponseEvent $event)
{
$response = $event->getResponse();
$request = $event->getRequest();
$this->setStatusCode($request, $response);
$this->redirectFrom($event);
$this->addRequestId($response);
}
protected function addRequestId(Response $response)
{
if ($this->elasticSearchHandler->getRequestId()) {
$response->headers->set('x-request-id', $this->elasticSearchHandler->getRequestId());
}
}
protected function setStatusCode(Request $request, Response $response): void
{
$statusCode = $request->attributes->get('status_code');
if (!empty($statusCode)) {
$response->setStatusCode($statusCode);
}
}
protected function redirectFrom(ResponseEvent $event)
{
$request = $event->getRequest();
if ($request->query->has("redirect_form")) {
$response = new RedirectResponse($request->query->get("redirect_form"));
$event->setResponse($response);
if ($this->session->has('form_redirect_notice_success')) {
$this->session->getFlashBag()->add('notice_success', $this->session->get('form_redirect_notice_success'));
$this->session->remove('form_redirect_notice_success');
}
}
}
}