How to inject the @request into a service? How to inject the @request into a service? symfony symfony

How to inject the @request into a service?


In Symfony 2.4, this has changed. Now, you can inject the 'request_stack' service.

For example:

use Symfony\Component\HttpFoundation\RequestStack;class MyService{    protected $request;    public function setRequest(RequestStack $request_stack)    {        $this->request = $request_stack->getCurrentRequest();    }}

In your config.yml:

services:    my.service:        class: Acme\DemoBundle\MyService        calls:            - [setRequest, ["@request_stack"]]

Full documentation is here: http://symfony.com/blog/new-in-symfony-2-4-the-request-stack


I think there may have been some misunderstanding about what the official documentation says. In most cases you do want to inject the request directly with a scope="request" attribute on the service element. This makes the Scope Widening go away.

<service     id="zayso_core.openid.rpx"     class="Zayso\CoreBundle\Component\OpenidRpx" public="true" scope="request">

or in yml

zayso_core.openid.rpx:     class: Zayso\CoreBundle\Component\OpenidRpx    public: true    scope: request

It's only in specific special cases such as Twig extensions where you need to inject the container.

And kernel is not even mentioned in the page on scopes. Injecting the kernel is far worse (conceptually) than injecting a container.

UPDATE: For S2.4 and newer, use @Blowski's answer below.


NB: This answer was written back in 2012, when Symfony 2.0 was out and then it was the good way to do! Please don't downvote any more :)


Today I went through same problem myself, so here are my 5 cents. According to the official documentation it is usually not required to inject request into your services. In your service class you can pass kernel container (injecting it is not a big overhead, as it sounds), and then access request like this:

public function __construct(\AppKernel $kernel){    $this->kernel = $kernel;}public function getRequest(){    if ($this->kernel->getContainer()->has('request')) {        $request = $this->kernel->getContainer()->get('request');    } else {        $request = Request::createFromGlobals();    }    return $request;}

This code is also working fine when service is accessed in CLI (eg, during unit-testing).