我想找到一种方法,使用Symfony 2的Dependency Injection组件和新的PHP 5.4trait。我的项目有解耦的View类,它们都有自己特定的构造函数。每个View可以使用零个或多个视图帮助器,这些视图帮助器被定义为traits。
主要问题显然是视图不会由DI容器创建,但可以在应用程序流的任何位置创建。只有在呈现之前才需要注入依赖项。
最后注意:我不局限于Symfony组件。任何其他DI容器的线索也将不胜感激。
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类使用的所有traits执行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容器的线索也将不胜感激。
TranslatorHelper
)的通用性,因此理想情况下它们不应该包含容器中依赖项的特定于项目的ID。 - BenMorel