使用Twig嵌入控制器

时间:2013-05-30 12:38:34

标签: symfony twig

我做得更简单了(对于我在底部留下的复杂问题道歉)。

我希望有一个树枝模板渲染另一个控制器作为子部分。

这是父树枝(Resources / views / Default / testRenderParent.html.twig):

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

这是儿童树枝(Resources / views / Default / testRenderChild.html.twig):

KID

控制器(Controller / 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”部分)运行它时,你应该得到回应:

看!我是你父亲! 但是,看,我是你的KID

然而,相反,你会得到回应,以及它下面的错误:

看!我是你父亲! 但是,看,我不是你的 看!我是你父亲! 但是,看,我不是你的 看!我是你父亲! 但是,看,我不是你的 看!我是你父亲! 但是,看,我不是你的 看!我是你父亲! 但是,看,我不是你的 看!我是你父亲! 但是,看,我不是你的 看!我是你父亲! 但是,看,我不是你的 看!我是你父亲! 但是,看,我不是你的 FatalErrorException:错误:达到'250'的最大函数嵌套级别,正在中止!在/Users/sarel/www/playpen/app/cache/dev/classes.php第6134行

因此你可以看到,它正在呈现“看!我是你的父亲!但是看,我是你的......”然后不再使用它的枝条模板渲染子控制器,而是重新渲染父级,结束于一个无限循环,被例外逮捕。

---在我改变之前复制---
---在我改变之前复制---
---在我改变之前复制---

所以我试图使用enter link description here中的指南在我的symfony2项目中嵌入一个控制器(最终是动作呈现的模板)。

我的控制器定义如下:

<?php
namespace OTS\CoreBundle\Controller;

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

我附加了一个twig模板,现在只有一个名为addEmergencyContact.html.twig的twig文件形式的“hello world”。

当我转到这个的URL时,就像localhost / my_route_to_it一样,它工作得很好,我在屏幕上看到“hello world”。

现在,根据this,我只需将以下twig命令放入:

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

当我执行此操作并加载保持路径时,它似乎正在尝试加载主路径,然后在我渲染子路径的位置内再次加载主路径。我知道这是因为它告诉我缺少变量 - 我只在主枝文件中使用的变量。

然而,当我:

  1. 那里没有{{render ...}},它运行正常 - 也就是说,除了缺少变量外,其他代码不是
  2. 只渲染儿童路线我得到一个漂亮的“你好世界” - 也就是说,这不是儿童树枝或儿童控制器的错误

2 个答案:

答案 0 :(得分:2)

嗯。这个问题有点令人困惑,但是:

一个。与所有控制器操作一样,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);
    }
}

℃。然后渲染线进入hello_world.html.twig文件。

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

d。请注意,您的emergency_contact模板只能访问紧急联系操作传递给它的值。它不会“继承”hello_world的值。

那为什么我的代码格式搞砸了呢?不喜欢编号列表。

答案 1 :(得分: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();
    }
}