感谢你来到这里
                我真的很激动
                盼望,能有你的支持
            捐赠可扫描二维码转账支付
                
                    支付宝扫一扫付款
                    微信扫一扫付款
(微信为保护隐私,不显示你的昵称)
从Symfony2.4开始,作为注入request服务的替代,你应该注入request_stack服务。要使用Request对象,则通过getCurrentRequest()方法来得到:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21  | namespace Acme\HelloBundle\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
    }
 
    // ...
} | 
现在,在定义中注入 request_stack,就像注入其他服务一样:
1 2 3 4 5  | # src/Acme/HelloBundle/Resources/config/services.yml
services:
    newsletter_manager:
        class:     Acme\HelloBundle\Newsletter\NewsletterManager
        arguments: ["@request_stack"] | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  | <!-- src/Acme/HelloBundle/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="Acme\HelloBundle\Newsletter\NewsletterManager"
        >
            <argument type="service" id="request_stack"/>
        </service>
    </services>
</container> | 
1 2 3 4 5 6 7 8 9  | // src/Acme/HelloBundle/Resources/config/services.php
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;
 
// ...
$container->setDefinition('newsletter_manager', new Definition(
    'Acme\HelloBundle\Newsletter\NewsletterManager',
    array(new Reference('request_stack'))
)); | 
所有Symfony2内建的服务遵循同一原则:容器创建(该服务)的实例只有一个,当你需要得到它时,或当它被注入到其他服务时,容器就返回这个实例。在标准版Symfony中的唯一例外,就是request服务。
当你试图注入request对象到某个服务时,你可能会得到一个ScopeWideningInjectionException异常。这是因为request在生命周期中可以发生改变(例如,当一个sub-request子请求被创建时)
如果你将一个controller定义为服务,你可以得到一个Request对象而毋须将整个容器注入进来,这是通过把Request当成参数(argument)传给action方法来实现的。参考控制器中的Request对象参数以获得更多细节。
本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。