How to Retrieve the Request from the Service Container

How to Retrieve the Request from the Service Container

Whenever you need to access the current request in a service, you can either add it as an argument to the methods that need the request or inject the request_stack service and access the Request by calling the getCurrentRequest() method:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
namespace AppBundle\Newsletter;

use Symfony\Component\HttpFoundation\RequestStack;

class NewsletterManager
{
    protected $requestStack;

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

    public function anyMethod()
    {
        $request = $this->requestStack->getCurrentRequest();
        // ... do something with the request
    }

    // ...
}

Now, just inject the request_stack, which behaves like any normal service:

  • YAML
    1
    2
    3
    4
    5
    # src/AppBundle/Resources/config/services.yml
    services:
        newsletter_manager:
            class:     AppBundle\Newsletter\NewsletterManager
            arguments: ["@request_stack"]
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    <!-- src/AppBundle/Resources/config/services.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <services>
            <service
                id="newsletter_manager"
                class="AppBundle\Newsletter\NewsletterManager"
            >
                <argument type="service" id="request_stack"/>
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    // src/AppBundle/Resources/config/services.php
    use AppBundle\Newsletter\NewsletterManager;
    use Symfony\Component\DependencyInjection\Reference;
    
    // ...
    $container->register('newsletter_manager', NewsletterManager::class)
        ->addArgument(new Reference('request_stack'));
    

Tip

If you define a controller as a service then you can get the Request object without injecting the container by having it passed in as an argument of your action method. See The Request object as a Controller Argument for details.

This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.