我正在尝试找到一种使用 Symfony 2 Dependency Injection component 的方法使用新的 PHP 5.4 traits .
长话短说(实际上没那么短),我的项目解耦了 View 类,这些类都有自己的特定构造函数。每个 View 可以使用零个或多个 View 助手,这些 View 助手被定义为特征:
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)
{
// ...
}
}
我希望在我的 Controller 中有一个方法,renderView()
,它在渲染 View 之前根据 View 类使用的所有特征执行 setter 注入(inject):
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
组件执行此操作吗?
主要问题显然是 View 不会由 DI 容器创建,但可以在应用程序流中的任何位置创建。只有在渲染它们之前才需要注入(inject)依赖项。
最后一点:我不依赖于 Symfony 组件。任何其他 DI 容器的线索也将不胜感激。
最佳答案
Symfony 3.3 引入了自动连线服务的理念。
您所要做的就是在您的特征中创建一个 setter 函数并添加 @required
注释。
private $entityManager;
/**
* @required
* @param EntityManagerInterface $entityManager
*/
public function setEntityManager(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
关于php - 交响乐2 : dependency injection and traits,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11476222/