2013-08-22 34 views
0

我已经编写了一个自定义的Twig函数来呈现一些HTML。我的第一个想法是为渲染逻辑创建一个新的控制器,并在Twig扩展中使用它。但是,因为它调用模板{{ button() }}时抛出这个错误它不工作:如何在使用Symfony2的自定义Twig扩展中渲染控制器

FATALERROREXCEPTION:错误:调用一个成员函数get()方法在非对象IN/FOO /供应商/ Symfony的/ Symfony的/ SRC/SYMFONY/BUNDLE/FRAMEWORKBUNDLE/CONTROLLER/CONTROLLER.PHP LINE 106

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

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

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

您不适当地注射容器。但我真正的问题是,为什么你想在控制器中做到这一点? – Gerry

+0

Button正在呈现一个构造,其中有一些或多或少复杂的业务逻辑。所以我认为在一个控制器中执行此操作可以使它自己的模板成为首选方式。你会推荐什么? – acme

+0

这个逻辑可能也可以在另一个类或服务中实现。 – Gerry

回答

0

如果我明白了,你想,当你调用{{ button() }}功能,使控制器。

为什么不能做一个简单:

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

这避免给这样一个简单的任务,一个棘手的扩展。

如果你真的想打电话给{{ button() }},您可以创建一个宏,如:

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

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

+0

按钮渲染控制器中有更多的逻辑。它需要的变量并不都是在调用viewhelper的树枝模板中可用的。 – acme

相关问题