0

私が2つのサービスを持っているとしましょう:

get('my_first_service')
get('my_second_service')

私はこのようなことをしたい:

$this->get('my_first_service')->doSomething($this->get('my_second_service'));

これは、プロジェクトのあらゆる場所でアクティブにする必要がある初期化コードです。私が見る限り、いくつかのオプションがあります(両方のサービスは、vendor-dirから発生します(自分で記述していません)):

  1. 上記のコードを(いくつかの変更を加えて)app.phpおよび/またはapp_dev.phpに追加します
  2. 上記のコードをすべてのコントローラーアクションに追加します
  3. サービスを引数としてサービスを作成し、コンストラクターに上記のコードを追加します

最初のオプションは、app.phpファイルの編集をリンクしていないため、少し「珍しい」ように見えます。2番目のオプションは、数十のアクションに対してこれを行う必要があるため、非効率的です。3番目のアクションの方が良いようですが、コンストラクターを正しく実行するには、どこかからこのサービスを呼び出す必要がありますか?

可能性を逃しているような気がします...この種の初期化コードにはもっと良い場所があるはずですよね?

4

2 に答える 2

3

すべてのアクションの前に本当にコードを実行したい場合は、イベントkernel.controllerをリッスンできます。

クックブークでこの例を確認してください。

リスナーはサービスであるため、必要に応じて両方のサービスを注入できます。

于 2012-10-22T22:40:54.620 に答える
1

これは、セッターインジェクションと非常によく似ています。my_second_serviceをパラメーターとして、doSomethingを呼び出しとして追加できます。そうすれば、first_serviceを取得すると、メソッドが自動的に呼び出され、正しいパラメーターが渡され、醜いハッキングからあなたを救います。

構成でサービスをすでに定義していると思います。

例:YAMLの場合:

services:
   my_second_service:
       # ...
   my_first_service:
       class: MyFirstServiceClassName
       calls:
           - [ doSomething, [ @my_second_service ] ]

doSomethingが使用する必要のある別のオブジェクトを返す場合、それはファクトリのように聞こえますが、これも構成できます。これを読んでください。

于 2012-10-22T19:51:26.053 に答える