2013-08-22 70 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

相關問題