我编写了一个自定义的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();
}
}
答案 0 :(得分:0)
如果我理解,您希望在调用{{ button() }}
函数时渲染控制器。
为什么不做一个简单的事情:
{{ render(controller('AcmeDemoBundle:Button:show')) }}
这可以避免为这么简单的任务创建一个棘手的扩展。
如果您确实想要致电{{ button() }}
,可以创建一个宏,例如:
{% macro button() %}
{{ render(controller('AcmeDemoBundle:Button:show')) }}
{% endmacro %}
{% from _self.templateName import 'button' %}
现在,您可以在同一模板上使用{{ button() }}
。