使用原型范围时Symfony2 ScopeCrossingInjectionException

时间:2012-04-04 08:33:10

标签: service symfony scope

我的目标是将data_collector添加到我的类中,以便在开发人员工具栏上显示一些有用的信息。 我的服务:

services:
    my_api.auth.login:
        class: YO\ApiV1\Services\Auth\Login
        arguments:
            - requestId
            - "@old_sound_rabbit_mq.login_rpc"
            - "@service_container"
        scope: prototype

我需要范围原型为每个新调用设置不同的实例。顺便说一句,service @ old_sound_rabbit_mq.login_rpc也有范围“prototype”。 并且,我想附加data_collector,可以使用:

tags:
    - { name: data_collector, template: "AcmeDebug:Collector:templatename", id: "your_collector_name" }

但后来我有一个例外:

  

ScopeCrossingInjectionException:检测到Scope Crossing Injection:   定义“profiler”引用服务“my_api.auth.login”   属于另一个范围层次结构。这项服务可能不是   始终可用。一般来说,移动它更安全   将“profiler”定义为范围“prototype”,或将“container”声明为   儿童范围的“原型”。如果可以肯定其他范围   永远是活动的,您可以设置对strict = false的引用来摆脱   这个错误。

它让我困惑,因为我不知道该怎么做。我试图设置属性“strict = false”,但没有任何反应。

2 个答案:

答案 0 :(得分:6)

我猜symfony的同步服务可以帮助您:doc

否则你可以设置" strict = false"这样:

services:
    my.service.definition:
        class: Acme\Services\BlaService
        arguments:
            - "@any_other_service_from_narrower_scope="
        scope: prototype

" ="在服务定义结束时,从较窄的范围注入服务时,将转向" strict"为假

答案 1 :(得分:1)

Symfony 2.8之后的容器范围已被弃用。

scope: prototype已被shared: false

取代

http://symfony.com/doc/2.8/cookbook/service_container/shared.html