新しい PHP 5.4 traitsで Symfony 2依存性注入コンポーネントを使用する方法を見つけようとしています。
長い話を短くするために (実際にはそれほど短くはありません)、私のプロジェクトでは、すべて独自の特定のコンストラクターを持つ View クラスを分離しました。各ビューは、trait として定義されている 0 個以上のビュー ヘルパーを使用できます。
trait TranslatorHelper
{
/**
* @var Translator
*/
protected $translator;
/**
* @param Translator $translator
*/
protected function setTranslator(Translator $translator)
{
$this->translator = $translator;
}
/**
* @param string $text
* @return string
*/
public function translate($text)
{
return $this->translator->translate($text);
}
}
-
class UserEditView extends AbstractView
{
use TranslatorHelper;
public function __construct(User $user, UserEditForm $form)
{
// ...
}
}
renderView()
ビューをレンダリングする前に、ビュー クラスで使用されるすべての特性に基づいてセッター インジェクションを実行するメソッドをコントローラーに追加したいと考えています。
class Controller
{
public function renderView(View $view)
{
// Check what traits are used by $view, and inject their dependencies
// {...}
// Then render the View
return $view->render();
}
}
DependencyInjection
コンポーネントでこれを行う方法について何か考えはありますか?
主な問題は、明らかにビューが DI コンテナーによって作成されず、アプリケーション フローのどこでも作成できることです。依存関係を注入する必要があるのは、それらがレンダリングされる前だけです。
最後の注意: 私は Symfony コンポーネントに縛られていません。別の DI コンテナのリードも同様に高く評価されます。