为什么 symfony 3.4 中的 php 模板渲染会打印 http 标头?

Ign*_*hez 3 php symfony symfony-3.4

我正在尝试从混乱的 PHP 模板结构(带有许多重复的代码)转移到插槽,以帮助我们在扩展中拥有类似的树枝哲学。

我们遇到的问题是某些模板正在渲染 HTTP 标头: 在此输入图像描述

Form/form.html.php 的代码是:

<?php
/**
 * @var \Symfony\Bundle\FrameworkBundle\Templating\TimedPhpEngine    $view
 * @var \Symfony\Bundle\FrameworkBundle\Templating\Helper\FormHelper $formHelper
 * @var \Symfony\Component\Templating\Helper\SlotsHelper             $slotsHelper
 * @var \Symfony\Component\Form\FormView                             $form
 */
$formHelper = $view['form'];
$slotsHelper = $view['slots'];

?>
<div class="form-wrapper">
    <?php $slotsHelper->output('form-start', $formHelper->start($form)) ?>
    <?php $slotsHelper->output('form-widget', $formHelper->widget($form)) ?>
    <?php $slotsHelper->output('form-end', $formHelper->end($form)) ?>
</div>
Run Code Online (Sandbox Code Playgroud)

另一个模板 Form/Order/form.html.php 的代码是

<?php
/**
 * @var \Symfony\Bundle\FrameworkBundle\Templating\TimedPhpEngine    $view
 * @var \Symfony\Bundle\FrameworkBundle\Templating\Helper\FormHelper $formHelper
 * @var \Symfony\Component\Templating\Helper\SlotsHelper             $slotsHelper
 * @var \Symfony\Component\Form\FormView                             $form
 */
$formHelper = $view['form'];
$slotsHelper = $view['slots'];
$view->extend(':Form:form.html.php');

$slotsHelper->start('form-widget');
echo $formHelper->widget($form);
$slotsHelper->stop();
Run Code Online (Sandbox Code Playgroud)

在控制器中,我像往常一样渲染表单:

$this->render("Form/Order/form.html.php", ['form' => $orderForm->createView()])
Run Code Online (Sandbox Code Playgroud)

如果我用“返回的字符串”更改这句话,Symfony 只打印这个“返回的字符串”,而不是标题。

表单已正确呈现,但由于某种我无法理解的原因,Symfony 正在打印 HTTP 标头。

谢谢!

Ign*_*hez 5

好吧,在询问之后我仍在研究它,我终于找到了原因并感谢这篇文章

我已执行渲染,但render将渲染的模板返回为Response,因此返回 HTTP 标头。renderView只需返回渲染的模板即可。

所以我只需要改变这一行:

$this->render("Form/Order/form.html.php", ['form' => $orderForm->createView()])
Run Code Online (Sandbox Code Playgroud)

$this->renderView("Form/Order/form.html.php", ['form' => $orderForm->createView()])
Run Code Online (Sandbox Code Playgroud)

现在,它按预期工作。