1

我让它变得更简单(为我留在底部的复杂问题道歉)。

我想让一个树枝模板将另一个控制器作为子部分呈现。

这是父树枝(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 运行此程序时(注意“父”部分),您应该得到回显:

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

但是,相反,您会得到回显,并在其下方显示错误:

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

因此你可以看到,它正在渲染“看!我是你的父亲!但是看,我是你的”......然后它不是用树枝模板渲染子控制器,而是重新渲染父控制器,以无限循环结束,被异常逮捕。

--- 修改前复制 ---
--- 修改前复制 ---
--- 修改前复制 ---

因此,我尝试使用在此处输入链接描述中的指南在我的 symfony2 项目中嵌入一个控制器(以及最终操作呈现的模板) 。

我的控制器定义如下:

<?php
namespace OTS\CoreBundle\Controller;

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

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

当我为此访问 URL 时,它类似于 localhost/my_route_to_it 它工作得非常好,我在屏幕上看到“hello world”。

现在,根据这个,我只需要输入以下 twig 命令:

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

当我这样做并加载hold-route时,它似乎正在尝试加载主路由,然后在渲染子路由的位置再次加载主路由。我知道这一点是因为它告诉我缺少变量——我只在主树枝文件中使用的变量。

然而,当我:

  1. 那里没有 {{ render... }},它工作正常 - 即不是其他代码给了我缺少变量的例外
  2. 只渲染子路由我得到了一个不错的“hello world”——也就是说,有问题的不是子树枝或子控制器
4

2 回答 2

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();
    }
}
于 2013-05-31T11:31:24.787 回答
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 的值。

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

于 2013-05-30T13:37:27.090 回答