Symfony 2 Dependency Injection component을 새로운 PHP 5.4 traits과 함께 사용하는 방법을 찾으려고합니다.Symfony 2 : 의존성 삽입 및 특성
짧은 이야기를 짧게 만들기 위해 (사실 짧지는 않음) 내 프로젝트는 모든 고유 한 특정 생성자가있는 View 클래스를 분리했습니다. 각보기의 특성으로 정의되는 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()
을하는 방법을 가지고 싶습니다, 그 세터을 수행 View 클래스에서 사용하는 모든 특성을 기반으로 주입보기를 렌더링하기 전에 :
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();
}
}
012와 함께이 작업을 수행하는 방법에 대한 아이디어구성 요소?
보기가 DI 컨테이너에 의해 생성되지 않지만 응용 프로그램 흐름의 어디에서나 생성 될 수 있다는 것이 주된 문제입니다. 종속성을 주입해야하는 것은 렌더링되기 전입니다.
마지막주의 사항 : 나는 Symfony 구성 요소와 관련이 없습니다. 다른 DI 컨테이너에있는 모든 리드도 감사 할 것입니다.
AOP로 DI를 시도해 볼 수 있습니다 : https://github.com/schmittjoh/JMSAopBundle/blob/master/Resources/doc/index.rst 속성 및 인수의 주석으로 서비스를 자동 삽입 할 수 있습니다. – lisachenko
문제는 뷰 헬퍼 (예 :'TranslatorHelper')를 일반적인 것으로 유지하려는 것이므로 이상적으로는 컨테이너에있는 종속성의 프로젝트 고유 ID를 포함하지 않아야합니다. – Benjamin