CreateThemedResponseSubscriber   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 83
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 28
c 0
b 0
f 0
dl 0
loc 83
rs 10
wmc 13

6 Methods

Rating   Name   Duplication   Size   Complexity  
A onKernelRequest() 0 24 4
A getSubscribedEvents() 0 4 1
A getDashboardControllerFqcn() 0 18 5
A getDashboardControllerInstance() 0 3 1
A __construct() 0 5 1
A getCrudControllerInstance() 0 7 1
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Zikula package.
7
 *
8
 * Copyright Zikula - https://ziku.la/
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Zikula\ThemeBundle\EventSubscriber;
15
16
use EasyCorp\Bundle\EasyAdminBundle\Config\Option\EA;
17
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Controller\CrudControllerInterface;
18
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Controller\DashboardControllerInterface;
19
use EasyCorp\Bundle\EasyAdminBundle\Factory\AdminContextFactory;
20
use EasyCorp\Bundle\EasyAdminBundle\Factory\ControllerFactory;
21
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
22
use Symfony\Component\HttpFoundation\Request;
23
use Symfony\Component\HttpKernel\Event\RequestEvent;
24
use Symfony\Component\HttpKernel\KernelEvents;
25
use Zikula\ThemeBundle\Helper\FallbackDashboardDetector;
26
27
class CreateThemedResponseSubscriber implements EventSubscriberInterface
28
{
29
    public function __construct(
30
        private readonly AdminContextFactory $adminContextFactory,
31
        private readonly ControllerFactory $controllerFactory,
32
        private readonly FallbackDashboardDetector $dashboardDetector
33
    ) {
34
    }
35
36
    public static function getSubscribedEvents(): array
37
    {
38
        return [
39
            KernelEvents::REQUEST => ['onKernelRequest', -50], // run after AdminRouterSubscriber (has default priority 0)
40
        ];
41
    }
42
43
    public function onKernelRequest(RequestEvent $event): void
44
    {
45
        $request = $event->getRequest();
46
        if (null !== $request->attributes->get(EA::CONTEXT_REQUEST_ATTRIBUTE)) {
47
            // nothing to do if we already have an EA context
48
            return;
49
        }
50
51
        if (null === $dashboardControllerFqcn = $this->getDashboardControllerFqcn($request)) {
52
            // current controller is not a dashboard controller, so add a fallback
53
            $dashboardControllerFqcn = $this->dashboardDetector->getDashboardControllerFqcn($request);
54
        }
55
56
        if (null === $dashboardControllerInstance = $this->getDashboardControllerInstance($dashboardControllerFqcn, $request)) {
57
            return;
58
        }
59
60
        // $crudControllerInstance is always null atm but this seems fine as we are dealing with a regular Symfony controller
61
        $crudControllerInstance = $this->getCrudControllerInstance($request);
62
        $adminContext = $this->adminContextFactory->create($request, $dashboardControllerInstance, $crudControllerInstance);
63
        $request->attributes->set(EA::CONTEXT_REQUEST_ATTRIBUTE, $adminContext);
64
65
        $request->query->set(EA::ROUTE_NAME, $request->attributes->get('_route'));
66
        $request->query->set(EA::ROUTE_PARAMS, $request->attributes->get('_route_params'));
67
    }
68
69
    /**
70
     * Copy of AdminRouterSubscriber#getDashboardControllerFqcn.
71
     */
72
    private function getDashboardControllerFqcn(Request $request): ?string
73
    {
74
        $controller = $request->attributes->get('_controller');
75
        $controllerFqcn = null;
76
77
        if (\is_string($controller)) {
78
            [$controllerFqcn] = explode('::', $controller);
79
        }
80
81
        if (\is_array($controller)) {
82
            $controllerFqcn = $controller[0];
83
        }
84
85
        if (\is_object($controller)) {
86
            $controllerFqcn = $controller::class;
87
        }
88
89
        return is_subclass_of($controllerFqcn, DashboardControllerInterface::class) ? $controllerFqcn : null;
90
    }
91
92
    /**
93
     * Copy of AdminRouterSubscriber#getDashboardControllerInstance.
94
     */
95
    private function getDashboardControllerInstance(string $dashboardControllerFqcn, Request $request): ?DashboardControllerInterface
96
    {
97
        return $this->controllerFactory->getDashboardControllerInstance($dashboardControllerFqcn, $request);
98
    }
99
100
    /**
101
     * Copy of AdminRouterSubscriber#getCrudControllerInstance.
102
     */
103
    private function getCrudControllerInstance(Request $request): ?CrudControllerInterface
104
    {
105
        $crudControllerFqcn = $request->query->get(EA::CRUD_CONTROLLER_FQCN);
106
107
        $crudAction = $request->query->get(EA::CRUD_ACTION);
108
109
        return $this->controllerFactory->getCrudControllerInstance($crudControllerFqcn, $crudAction, $request);
110
    }
111
}
112