Куда добавить один раз код чтобы он отрабатывал по определенному нейспейсу для всех контроллеров и их методов?

Чтобы код отрабатывал по определенному неймспейсу для всех контроллеров и их методов в Symfony, можно использовать middleware или event listener.

Middleware - это класс, который добавляется в конвейер (pipeline) обработки запросов и между запросом и ответом может вмешиваться в обработку запроса. Middleware можно добавить как глобально для всего приложения, так и для определенных URL-путей.

Чтобы добавить middleware для всех контроллеров и их методов в определенном неймспейсе, в Symfony с версии 5 можно воспользоваться атрибутом Route.

Например, если у вас есть неймспейс AppControllerAdmin, и вы хотите добавить определенный класс Middleware для всех контроллеров и методов в этом неймспейсе, вы можете сделать следующее:

1. Создайте свой класс Middleware, который будет обрабатывать нужную вам логику:

// src/Middleware/AdminMiddleware.php

namespace AppMiddleware;

use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHttpKernelHttpKernelInterface;

class AdminMiddleware implements HttpKernelInterface
{
    private $app;

    public function __construct(HttpKernelInterface $app)
    {
        $this->app = $app;
    }

    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
    {
        // Ваша обработка запроса здесь
        // Например, вы можете проверить аутентификацию пользователя или его роль,
        // и если он не аутентифицирован или не имеет необходимой роли, то вернуть Response с ошибкой

        return $this->app->handle($request, $type, $catch);
    }
}

2. Зарегистрируйте ваш middleware в конфигурации вашего приложения:

# config/services.yaml

services:
    AppMiddlewareAdminMiddleware:
        arguments: ['@http_kernel']

3. Добавьте атрибут Route к вашему контроллеру или методу и укажите ваш middleware. Например:

// src/Controller/Admin/MyController.php

namespace AppControllerAdmin;

use SymfonyComponentRoutingAnnotationRoute;
use SymfonyBundleFrameworkBundleControllerAbstractController;

/**
 * @Route("/admin")
 */
class MyController extends AbstractController
{
    /**
     * @Route("/my-route", name="admin_my_route")
     *
     * @SymfonyComponentRoutingAnnotationMiddleware("AppMiddlewareAdminMiddleware")
     */
    public function myAction()
    {
        // Выполните вашу логику действия здесь
    }
}

Теперь ваш middleware будет применяться ко всем контроллерам и методам в неймспейсе AppControllerAdmin, включая все подкаталоги этого неймспейса.

Event listener - это класс, который прослушивает определенные события в Symfony и может выполнять свою логику, когда событие происходит. Вы можете создать собственный event listener и привязать его к событию kernel.controller, чтобы он применялся ко всем контроллерам и их методам в определенном неймспейсе.

1. Создайте свой класс event listener, который будет обрабатывать нужную вам логику:

// src/EventListener/AdminEventListener.php

namespace AppEventListener;

use SymfonyComponentHttpKernelEventControllerEvent;

class AdminEventListener
{
    public function onKernelController(ControllerEvent $event)
    {
        // Ваша обработка контроллера здесь
        // Например, вы можете проверить аутентификацию пользователя или его роль,
        // и если он не аутентифицирован или не имеет необходимой роли, то выбросить исключение
    }
}

2. Зарегистрируйте ваш event listener в конфигурации вашего приложения:

# config/services.yaml

services:
    AppEventListenerAdminEventListener:
        tags:
            - { name: kernel.event_listener, event: kernel.controller }

3. Если ваш event listener применяется ко всем контроллерам и методам в определенном неймспейсе, вы можете использовать атрибут Route к вашему контроллеру или методу. Например:

// src/Controller/Admin/MyController.php

namespace AppControllerAdmin;

use SymfonyComponentRoutingAnnotationRoute;
use SymfonyBundleFrameworkBundleControllerAbstractController;

/**
 * @Route("/admin")
 */
class MyController extends AbstractController
{
    /**
     * @Route("/my-route", name="admin_my_route")
     */
    public function myAction()
    {
        // Выполните вашу логику действия здесь
    }
}

Теперь ваш event listener будет применяться ко всем контроллерам и методам в неймспейсе AppControllerAdmin, включая все подкаталоги этого неймспейса.

Оба подхода (middleware и event listener) позволяют вам добавить код, который будет отрабатывать по определенному неймспейсу для всех контроллеров и их методов в Symfony. Выбор между этими двумя подходами зависит от конкретных требований вашего проекта и ваших предпочтений в организации кода.