私はしばらく 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();
このコードは私にとってはうまくいきますが、汚いトリックだと思います。私は何か間違ったことをしていますか?