【发布时间】:2012-07-13 15:25:40
【问题描述】:
我正在尝试找到一种方法来使用 Symfony 2 Dependency Injection component 和新的 PHP 5.4 traits。
长话短说(实际上不是那么短),我的项目已经解耦了 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)
{
// ...
}
}
我想在我的控制器renderView() 中有一个方法,它在渲染视图之前根据视图类使用的所有特征执行setter 注入:
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 容器上的任何线索也将不胜感激。
【问题讨论】:
-
您可以尝试使用 AOP 进行 DI:github.com/schmittjoh/JMSAopBundle/blob/master/Resources/doc/…,通过属性和参数的注释自动注入服务。
-
问题是我想让视图助手(例如
TranslatorHelper)保持通用,所以理想情况下它们不应该包含容器中依赖项的项目特定ID。
标签: php symfony dependency-injection