解决方案
您可以执行以下操作,替换最后一行return $this->render($tmpl);
:
$response = new Response();
$response->setContent($tmpl);
return $response;
不过不要忘记use Symfony\Component\HttpFoundation\Response;
在控制器的顶部放一个!
理论
好吧,让我们从你现在的位置开始。您在控制器内部,正在调用该render
方法。该方法定义如下:
/**
* Renders a view.
*
* @param string $view The view name
* @param array $parameters An array of parameters to pass to the view
* @param Response $response A response instance
*
* @return Response A Response instance
*/
public function render($view, array $parameters = array(), Response $response = null)
{
return $this->container->get('templating')->renderResponse($view, $parameters, $response);
}
docblock 告诉您它需要一个作为视图名称的字符串,而不是实际的模板。如您所见,它使用templating
服务并简单地来回传递参数和返回值。
运行php app/console container:debug
会显示所有已注册服务的列表。您可以看到它templating
实际上是Symfony\Bundle\TwigBundle\TwigEngine
. 该方法renderResponse
具有以下实现:
/**
* Renders a view and returns a Response.
*
* @param string $view The view name
* @param array $parameters An array of parameters to pass to the view
* @param Response $response A Response instance
*
* @return Response A Response instance
*/
public function renderResponse($view, array $parameters = array(), Response $response = null)
{
if (null === $response) {
$response = new Response();
}
$response->setContent($this->render($view, $parameters));
return $response;
}
您现在知道,当您调用该render
方法时,会传回一个 Response 对象,该对象本质上是一个普通Response
对象,在该对象上执行了 setContent,使用表示模板的字符串。
我希望你不介意我描述得更详细一点。我这样做是为了向您展示如何自己找到这样的解决方案。