Symfony2中的组件对应于Symfony1中的什么?

20
在我的Symfony2应用程序中,我希望在各个页面上显示一个小部件。这不能只通过其模板来定义,它需要调用数据库并经过控制器。
在Symfony1中,我会创建一个组件并将其包含进来。在Symfony2中,我该如何做到同样的效果?
2个回答

27

我进行了更多的研究,发现最简单的方法只需要在模板中添加这一行代码:

{% render 'MyBundle:MyController:myAction' %}

这会输出由该操作指定的模板呈现出的结果。


4
更多信息请访问:http://symfony.com/doc/current/book/templating.html#templating-embedding-controller - c33s
渲染方法的签名已经在2.2版本中更改,现在是{{ render(controller('MyBundle:Ctrl:myAction')) }},其中Ctrl是控制器名称,不包括结尾的Controller字符串。请查看http://symfony.com/fr/doc/current/book/templating.html#templating-embedding-controller。 - COil
更多信息:http://symfony.com/doc/current/templating/embedding_controllers.html(c33s的URL已更改) - fishbone

8
您可以使用函数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 ^^ - KingCrunch
如果我们应该将对象/集合放入小部件中,会怎样呢? - Koc
不要使用 render 'AcmeBundle:AcmeController:fooAction with {parameter: myObject} :)。 - KingCrunch
你看到核心代码的最新更改了吗?从2.2开始,每个可在模板中呈现的操作应该有路由。且参数可以是路由参数或查询字符串。 https://github.com/symfony/symfony/commit/64d43c806bc1c00dda536305565d8aaa3d07b699#diff-0 ,所以 render 不好用, widget() 更强大。 - Koc
好的,但是得了吧,4天? ;) 今晚我会更新我的私人演示应用程序,所以我想我稍后会注意到它。谢谢提示,我认为这将节省我一些时间。 - KingCrunch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接