在我的Symfony2应用程序中,我希望在各个页面上显示一个小部件。这不能只通过其模板来定义,它需要调用数据库并经过控制器。
在Symfony1中,我会创建一个组件并将其包含进来。在Symfony2中,我该如何做到同样的效果?
在Symfony1中,我会创建一个组件并将其包含进来。在Symfony2中,我该如何做到同样的效果?
我进行了更多的研究,发现最简单的方法只需要在模板中添加这一行代码:
{% render 'MyBundle:MyController:myAction' %}
这会输出由该操作指定的模板呈现出的结果。
widget
创建Twig扩展,并在容器中注册它。同时,将Kernel
注入到该扩展中。class WidgetFactoryExtension extends \Twig_Extension
{
protected $kernel;
public function __construct($kernel)
{
$this->kernel= $kernel;
}
public function getFunctions()
{
return array(
'widget' => new \Twig_Function_Method($this, 'createWidget', array('is_safe' => array('html'))),
);
}
public function createWidget($name, array $options = array())
{
list($bundle, $widget) = explode(':', $name);
$widgetClass = $this->kernel->getBundle($bundle)->getNamespace() . '\\Widget\\' . $widget;
$widgetObj = new $widgetClass();
$widgetObj->setContainer($this->kernel->getContainer());
if ($options) {
$widgetObj->setOptions($options);
}
return $widgetObj;
}
}
在模板中添加以下内容:
{{ widget('QuestionsBundle:LastAnswers', {'answersCount' : 10}) }}
{# class QuestionsBundle/Widget/LastAnswers #}
render
和/或 include
^^ - KingCrunchrender 'AcmeBundle:AcmeController:fooAction with {parameter: myObject}
:)。 - KingCrunchrender
不好用, widget()
更强大。 - Koc
{{ render(controller('MyBundle:Ctrl:myAction')) }}
,其中Ctrl
是控制器名称,不包括结尾的Controller
字符串。请查看http://symfony.com/fr/doc/current/book/templating.html#templating-embedding-controller。 - COil