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 にも「prototype」というスコープがあります。そして、data_collector を添付したいと思います。これは次の方法で実行できます。

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

しかし、私は例外を得ました:

ScopeCrossingInjectionException: スコープ クロッシング インジェクションが検出されました: 定義 "profiler" は、別のスコープ階層に属するサービス "my_api.auth.login" を参照しています。このサービスは常に利用できるとは限りません。一般に、定義「プロファイラー」をスコープ「プロトタイプ」に移動するか、「コンテナー」を「プロトタイプ」の子スコープとして宣言する方が安全です。他のスコープが常にアクティブであることが確実な場合は、参照を 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

より狭い範囲からサービスを注入するときにサービス定義の末尾にある「=」は、「strict」を 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 に答える