11

我的目标是将 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

我需要范围原型来为每个新调用提供不同的实例。顺便说一句,服务@old_sound_rabbit_mq.login_rpc 也有范围“原型”。而且,我想附上 data_collector,这可以通过以下方式完成:

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

但后来我遇到了一个例外:

ScopeCrossingInjectionException:检测到范围交叉注入:定义“分析器”引用了属于另一个范围层次结构的服务“my_api.auth.login”。此服务可能无法始终可用。通常,将定义“profiler”移动到“prototype”范围,或者将“container”声明为“prototype”的子范围更安全。如果您可以确定其他范围始终处于活动状态,则可以将引用设置为 strict=false 以消除此错误。

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

4

2 回答 2

6

我猜 symfony 的同步服务可能会对你有所帮助:doc

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

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

当从更窄的范围注入服务时,服务定义末尾的“=”会将“严格”变为 false

于 2014-06-17T07:00:56.640 回答
1

自 Symfony 2.8 以来的容器范围已被弃用。

scope: prototype被替换为shared: false

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

于 2016-05-16T07:15:44.303 回答