gpt4 book ai didi

来自自定义位置的 Symfony 渲染模板

转载 作者:行者123 更新时间:2023-12-02 10:43:47 25 4
gpt4 key购买 nike

我尝试不使用 Symfony2 所需格式“Bundle:Controller:file_name”来渲染模板,但希望从某个自定义位置渲染模板。

Controller 中的代码抛出异常

Catchable Fatal Error: Object of class __TwigTemplate_509979806d1e38b0f3f78d743b547a88 could not be converted to string in Symfony/vendor/symfony/symfony/src/Symfony/Bundle/TwigBundle/Debug/TimedTwigEngine.php line 50

我的代码:

$loader = new \Twig_Loader_Filesystem('/path/to/templates/');
$twig = new \Twig_Environment($loader, array(
'cache' => __DIR__.'/../../../../app/cache/custom',
));
$tmpl = $twig->loadTemplate('index.twig.html');
return $this->render($tmpl);

在 Symfony 中是否可以做这样的事情,或者我们只能使用逻辑名称格式?

最佳答案

解决方案

您可以执行以下操作,替换最后一行return $this->render($tmpl);:

$response = new Response();
$response->setContent($tmpl);
return $response;

不要忘记在 Controller 顶部放置use Symfony\Component\HttpFoundation\Response;!

理论

好吧,让我们从现在的位置开始吧。您在 Controller 内,调用 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);
}

文档 block 告诉您它需要一个字符串,该字符串是 View 名称,而不是实际的模板。正如您所看到的,它使用模板服务并简单地来回传递参数和返回值。

运行php app/console container:debug会显示所有已注册服务的列表。您可以看到 templatetting 实际上是 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代表模板。

希望您不介意我描述得更详细一些。我这样做是为了向您展示如何自己找到这样的解决方案。

关于来自自定义位置的 Symfony 渲染模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14320031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com