0

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

致命错误异常:错误:在 /FOO/VENDOR/SYMFONY/SYMFONY/SRC/SYMFONY/BUNDLE/FRAMEWORKBUNDLE/CONTROLLER/CONTROLLER.PHP 第 106 行中的非对象上调用成员函数 GET()

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

控制器(去除了不必要的代码):

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class ButtonController extends Controller {

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

树枝扩展:

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();
    }
}
4

1 回答 1

0

如果我理解,您希望在调用该{{ button() }}函数时呈现一个控制器。

为什么不做一个简单的:

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

这避免了为这样一个简单的任务创建一个棘手的扩展。

如果您真的非常想调用{{ button() }},可以创建一个宏,例如:

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

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

于 2013-08-23T08:35:14.580 回答