如何使用Symfony2在自定义Twig扩展中呈现控制器

时间:2013-08-22 09:35:11

标签: symfony twig

我编写了一个自定义的Twig函数,它应该呈现一些HTML。我的第一个想法是为渲染逻辑创建一个新的Controller,并在Twig扩展中使用它。但它不起作用,因为它在模板中调用{{ button() }}时会抛出此错误:

FATALERROREXCEPTION:错误:呼叫成员功能()在/FOO/VENDOR/SYMFONY/SYMFONY/SRC/SYMFONY/BUNDLE/FRAMEWORKBUNDLE/CONTROLLER/CONTROLLER.PHP第106行中的非对象上获取

Twig扩展基本上可以工作(我已经实现了一些这里没有显示的简单助手)。

控制器(剥离不必要的代码):

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class ButtonController extends Controller {

    public function showAction()
    {
        [...]
        return $this->render(
            'AcmeDemoBundle:Default:button.html.twig', array($vars)
        );
    }
}

Twig扩展名:

class AcmeExtension extends \Twig_Extension {

    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('button', array($this, 'button'), array('is_safe' => array('html'))),
        );
    }

    public function button()
    {
        $controller = new ButtonController();
        return $controller->showAction();
    }
}

1 个答案:

答案 0 :(得分:0)

如果我理解,您希望在调用{{ button() }}函数时渲染控制器。

为什么不做一个简单的事情:

{{ render(controller('AcmeDemoBundle:Button:show')) }}

这可以避免为这么简单的任务创建一个棘手的扩展。

如果您确实想要致电{{ button() }},可以创建一个宏,例如:

{% macro button() %}
    {{ render(controller('AcmeDemoBundle:Button:show')) }}
{% endmacro %}
{% from _self.templateName import 'button' %}

现在,您可以在同一模板上使用{{ button() }}