Как правильно получить Request в сервисе Symfony?

В Symfony можно получить Request в сервисе несколькими способами. Рассмотрим несколько наиболее распространенных подходов:

1. Инъекция зависимости через конструктор:
В данном случае в сервис передается экземпляр объекта Request при его создании. Создайте свой сервис и в конструкторе принимайте аргумент с типом SymfonyComponentHttpFoundationRequest. Пример:

   use SymfonyComponentHttpFoundationRequest;

   class MyService
   {
       private $request;

       public function __construct(Request $request)
       {
           $this->request = $request;
       }
   }

Symfony сам автоматически создаст экземпляр объекта Request и передаст его в конструктор при создании сервиса.

2. Инъекция зависимости через метод:
В Symfony также можно использовать методы-сеттеры для инъекции зависимостей. Создайте метод setRequest(), который будет принимать аргумент с типом SymfonyComponentHttpFoundationRequest и устанавливать его в ваш сервис. Пример:

   use SymfonyComponentHttpFoundationRequest;

   class MyService
   {
       private $request;

       public function setRequest(Request $request)
       {
           $this->request = $request;
       }
   }

При этом в файле конфигурации вашего сервиса (обычно это файл services.yml) укажите, что вам нужно вызвать этот метод и передать в него экземпляр объекта Request. Пример:

   services:
       my_service:
           class: AppServiceMyService
           calls:
               - [setRequest, ['@request_stack.current_request']]

Здесь @request_stack.current_request - это ссылка на текущий объект Request.

3. Если вы не можете использовать инъекцию зависимости, вы можете получить объект Request из контейнера сервисов. Воспользуйтесь @request_stack или @request для доступа к текущему объекту Request внутри вашего сервиса. Пример:

   use SymfonyComponentHttpFoundationRequestStack;

   class MyService
   {
       private $requestStack;

       public function __construct(RequestStack $requestStack)
       {
           $this->requestStack = $requestStack;
       }

       public function someMethod()
       {
           $request = $this->requestStack->getCurrentRequest();
           // делайте что-то с объектом $request
       }
   }

В этом примере мы используем RequestStack, который предоставляет доступ к текущему объекту Request через метод getCurrentRequest(). Обратите внимание, что в этом случае вы получаете стек запросов, то есть все запросы, которые производятся в течение одного запроса.

Независимо от того, каким способом вы выбрали, в результате у вас будет доступ к объекту Request в вашем сервисе и вы сможете получить доступ к параметрам запроса, заголовкам, cookie и другим данным, которые предоставляет Symfony. Не забывайте, что для этих целей лучше использовать методы-геттеры объекта Request, чтобы гарантировать безопасность и предотвратить прямой доступ к данным запроса.