2

私はしばらく Symfony で作業しており、コントローラーをサービスとして使い始めました。問題は、依存関係の挿入がどのように機能するかがわからないことです。アクション内で $this を印刷すると、完全に機能します。

/**
 * @Route("/testing/this")
 */
public function thisAction(Request $request)
{
    var_dump($this);
    return new Response();
}

応答:

object(Linkedip\WizardBundle\Controller\PaymentsController)[153]
  protected 'object' => null
  protected 'container' => 
    object(appDevDebugProjectContainer)[198]
      protected 'parameterBag' => 
        object(Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag)[48]
          protected 'parameters' => 
            array
              ...

しかし、その後、コントローラーを他のコントローラーで使用するサービスにすることにしました (アクション メソッドとサービス メソッドを 1 つのコントローラーに含めたい)。

parameters:
linkedip.controller.payments.class: Linkedip\WizardBundle\Controller\PaymentsController

services:
    payments.controller:
        class:  %linkedip.controller.payments.class%

そのため、他のコントローラーで使用する予定の新しいメソッドを追加しますが、新しいメソッド内で $this を呼び出そうとすると、得られるものが見えます。

/**
 * @Route("/testing/this")
 */
public function thisAction(Request $request)
{
    $paymentsController = $this->get('payments.controller');
    $paymentsController->service();
    return new Response();
}


/**
 *  [SERVICE]
 */
public function service()
{
    var_dump($this);
    return null;
}

応答:

object(Linkedip\WizardBundle\Controller\PaymentsController)[937]
      protected 'object' => null
      protected 'container' => null

この問題を解決するために、$this オブジェクトをコントローラーに直接注入するセッターを作成しました。

/**
 *  [DEPENDENCY INJECTION]
 */
protected $object;
public function setObject($object) { $this->object = $object; }

そして、これらのサービスの 1 つを呼び出そうとすると、$this を設定する行を追加する必要があります。

$paymentsController = $this->get('payments.controller');
$paymentsController->setObject($this);

サービス メソッドでは、オブジェクトを呼び出します。

$em = $this->object->getDoctrine()->getManager();

このコードは私にとってはうまくいきますが、汚いトリックだと思います。私は何か間違ったことをしていますか?

4

2 に答える 2

2

[..]しかし、その後、コントローラーを他のコントローラーで使用するサービスにすることにしました (1 つのコントローラーにアクション メソッドとサービス メソッドを含めたい)。

このアーキテクチャの選択には同意しません。独自のコントローラーを作成して、他のコントローラーが継承できるようにする必要があります。それでもサービスが必要な場合は、サービスを作成できます。

于 2013-10-04T15:03:03.277 に答える
0

goto に同意します。1 つのクラス内で責任を混在させてはなりません。また、これが主に問題の原因です。あなたの質問に答えるには:

コントローラーをサービスとして定義することにより、コントローラーのデフォルトのインスタンス化ロジックを使用しないため、コンテナーは自動的に挿入されません。これを実現したい場合は、依存性注入構成内から手動でコンテナ (または必要な特定のサービス) を注入する必要があります。しかし、繰り返しになりますが、コントローラーを「通常の」方法で使用することを計画している場合、たとえばルートを定義することにより、物事は非常に面倒になるため、既に DIC で遊んでいる場合は、別のサービスを作成することをお勧めします。他のコントローラー内からそれを呼び出します。お役に立てれば。

于 2013-10-16T08:52:34.960 に答える