2013-05-30 62 views
1

我已經簡化了它(對於我在底部留下的複雜問題的道歉)。使用樹枝的嵌入控制器

我想要一個樹枝模板渲染另一個控制器作爲子部分。

這裏的父樹枝(資源/視圖/默認/ testRenderParent.html.twig):

<p>Look! I am your father!</p> 
<p>But look, I am not your 
{{ render(controller("SarelTestBundle:Default:testRenderChild")) }}</p> 

這裏的孩子樹枝(資源/視圖/默認/ testRenderChild.html.twig):

KID 

控制器(控制器/ DefaultController.php):

<?php 
namespace Sarel\Test\TestBundle\Controller; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; 

/** 
* @Template() 
**/ 
class DefaultController extends Controller 
{ 
    /** 
    * @Route("/testRenderParent") 
    */ 
    public function testRenderParentAction() 
    { 
     return array(); 
    } 

    /** 
    * @Route("/testRenderChild") 
    */ 
    public function testRenderChildAction() { 
     return array(); 
    } 
} 

當運行此,用下面的URL/testRenderChild你應該得到「KID」的迴應。 當你使用URL/testRenderParent(注意「Parent」部分)運行這個時,你應該得到迴應:

看!我是你爸爸!
但是你看,我是你的孩子

但是,而是你得到這個迴盪,和它下面的錯誤:

看!我是你爸爸!
但是看,我不是你的
看!我是你爸爸!
但是看,我不是你的
看!我是你爸爸!
但是看,我不是你的
看!我是你爸爸!
但是看,我不是你的
看!我是你爸爸!
但是看,我不是你的
看!我是你爸爸!
但是看,我不是你的
看!我是你爸爸!
但是看,我不是你的
看!我是你爸爸!
但是看,我不是你的
FatalErrorException:錯誤:達到'250'的最大功能嵌套級別,中止!在/Users/sarel/www/playpen/app/cache/dev/classes.php線6134

因此,你可以看到,它的渲染「看!我是你爸爸!但是你看,我是你的」 .. 。然後,而不是使用它的樹枝模板呈現子控制器,它將重新呈現父級,以無盡循環結束,並由異常捕獲。

---複製之前,我改變了它---
---複製之前,我改變了它---
---複製之前,我改變了它---

所以我m試圖在我的symfony2項目中使用enter link description here中的指導原則嵌入控制器(最後是動作呈現的模板)。

我的控制器定義如下:

<?php 
namespace OTS\CoreBundle\Controller; 

/** 
* @Template() 
*/ 
class EmergencyContactsController extends Controller 
{ 
    public function addEmergencyContactAction(Request $request, $id) { 
     return array(); 
    } 
} 

我必須附加到一個樹枝模板,它現在只是「世界你好」在名爲addEmergencyContact.html.twig樹枝文件的形式。

當我去到這個URL,這是類似localhost/my_route_to_it它工作得很好,我看到在屏幕上的「你好世界」。現在

,根據this我僅僅需要把下面的樹枝命令:

{{ render(controller('OTSCoreBundle:EmergencyContacts:addEmergencyContact', {'id': 15})) }} 

當我這樣做,我加載它似乎是試圖加載的主要途徑,保持路線,和然後在我渲染子路線的地方再次加載主路線。我知道這是因爲它告訴我缺少變量 - 我只在主分枝文件中使用的變量。

然而,當我:

  1. 不具備{{渲染...}}在那裏,它工作正常 - 也就是說,它並不是說竟然放棄了我丟失的變量
  2. 外其他代碼
  3. 只呈現孩子的路線我得到一個不錯的「你好世界」回來 - 即它不是孩子的小枝或兒童控制器的越野車
+0

這是一個有點不清楚你的問題是什麼? – cheesemacfly

+0

@cheesemacfly對不起,我已經澄清了,我也解決了它在爲它組合一個不錯的沙箱之後。它是與控制器關聯的@Template(),而不是SensioFrameworkExtraBundle提供的各個動作。 – Sarel

回答

2

嗯。問題有點令人困惑,但是:

A.與所有控制器動作一樣,addEmergencyContact需要返回響應,而不是數組。所以:

class EmergencyContactsController extends Controller 
{ 
    public function addEmergencyContactAction(Request $request, $id) 
    { 
     $tplData = array(); 
     $tplData['id'] = $id; 
     return $this->render('CoreBundle::emergency_contact.html.twig', $tplData); 
    } 
} 

B.您需要兩個模板文件。例如:

class HelloWorldController extends Controller 
{ 
    public function helloWorldAction(Request $request, $id) 
    { 
     $tplData = array(); 
     $tplData['id'] = $id; 
     return $this->render('CoreBundle::hello_world.html.twig', $tplData); 
    } 
} 

C.渲染線然後進入hello_world.html.twig文件。

{{ render(controller('OTSCoreBundle:EmergencyContacts:addEmergencyContact', {'id': 15})) }} 

D.請注意,您的emergency_contact模板只能訪問通過緊急聯繫操作傳入的值。它不會「繼承」hello_world所具有的值。

那麼,爲什麼我的代碼格式化搞砸了?不喜歡編號列表。

+0

實際上,他使用@Template標籤來定義模板。當你這樣做時,你只需要返回一個數組供模板使用:http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/view。html –

2

事實證明,這是註釋工作方式中的一個錯誤。當我將控制器從全局@Template()啓用更改爲單獨將每個操作移回舊的學校時,它就可以工作。下面是更新控制器,看看那裏的@Template()現在坐在:

<?php 
namespace Sarel\Test\TestBundle\Controller; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; 

class DefaultController extends Controller 
{ 
    /** 
    * @Route("/testRenderParent") 
    * @Template() 
    */ 
    public function testRenderParentAction() 
    { 
     return array(); 
    } 

    /** 
    * @Route("/testRenderChild") 
    * @Template() 
    */ 
    public function testRenderChildAction() { 
     return array(); 
    } 
} 
+0

要查看允許在控制器級別而不是操作級別使用@Template()註釋的文檔,請訪問:http://symfony.com/doc/2.2/bundles/SensioFrameworkExtraBundle/annotations/view.html – Sarel

+1

在控制器級別沒有看到任何帶'@ Template'的文檔。 –