<?php
declare(strict_types=1);
namespace App\EventSubscriber\PragmaActionsDisabler;
use App\Helper\Response\ResponseInterface as CustomResponseInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\KernelEvents;
class PragmaBoActionsDisablerSubscriber implements EventSubscriberInterface
{
private const ROUTES_TO_DISABLE = [
'foxorders_shop_menu_index',
'foxorders_shop_menu_show',
'foxorders_shop_category_index',
'foxorders_shop_product_index',
'foxorders_shop_option_index',
];
public function onKernelResponse(ResponseEvent $event): void
{
if (false === $event->isMainRequest()) {
return;
}
$request = $event->getRequest();
if (false === $this->isPragmaSource($request)) {
return;
}
$route = $request->attributes->get('_route');
if (false === \in_array($route, self::ROUTES_TO_DISABLE, true)) {
return;
}
$response = $event->getResponse();
if (false === $response instanceof Response) {
return;
}
$content = $response->getContent();
if (false === str_contains($content, '<body')) {
return;
}
$content = preg_replace(
'/<body([^>]*)>/',
'<body$1 data-buttons-disabled>',
$content
);
$response->setContent($content);
}
public function onKernelController(ControllerEvent $event): void
{
if (false === $event->isMainRequest()) {
return;
}
if (false === $this->isPragmaSource($event->getRequest())) {
return;
}
[$controllerObject, $methodName] = $this->getControllerInfos($event->getController());
if (null === $controllerObject) {
return;
}
if (false === $this->hasCheckActionsAllowedAttribute($controllerObject, $methodName)) {
return;
}
throw new AccessDeniedHttpException(CustomResponseInterface::NOT_ALLOWED);
}
public static function getSubscribedEvents()
{
return [
KernelEvents::CONTROLLER => 'onKernelController',
KernelEvents::RESPONSE => 'onKernelResponse',
];
}
private function getControllerInfos(mixed $controller): ?array
{
if (\is_array($controller) && 1 < \count($controller) && \is_object($controller[0]) && \is_string($controller[1])) {
return [$controller[0], $controller[1]];
}
return [null, null];
}
private function hasCheckActionsAllowedAttribute(object $controller, string $method): bool
{
try {
return [] !== (new \ReflectionMethod($controller, $method))->getAttributes(CheckActionsAllowed::class);
} catch (\ReflectionException) {
return false;
}
}
private function isPragmaSource(Request $request): bool
{
return false;
// $session = $request->getSession();
// if (null === $session) {
// return false;
// }
// $source = $session->get('shop')?->getSource();
// return null !== $source && \in_array($source->getCode(), SourceInterface::SOURCE_PRAGMA, true);
}
}