【问题标题】:Symfony render template from custom location来自自定义位置的 Symfony 渲染模板
【发布时间】:2012-12-28 12:09:26
【问题描述】:

我正在尝试不使用 Symfony2 所需格式“Bundle:Controller:file_name”来呈现模板,但想从某个自定义位置呈现模板。

控制器中的代码抛出异常

可捕获的致命错误:类的对象 __TwigTemplate_509979806d1e38b0f3f78d743b547a88 无法转换为字符串 Symfony/供应商/symfony/symfony/src/Symfony/Bundle/TwigBundle/Debug/TimedTwigEngine.php 第 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 中甚至可以做这样的事情,还是我们只需要使用逻辑名称格式?

【问题讨论】:

标签: symfony twig absolute-path


【解决方案1】:

解决方案

您可以执行以下操作,替换最后一行 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,使用表示模板的字符串。

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

【讨论】:

  • 感谢您的回答,我从中得到的主要内容是一个 php 应用程序/控制台容器:调试。以前我尝试过获取 loader 和 twig 环境,但没有成功,这就是为什么我尝试创建一个新的环境和 loader 实例。
  • 为我工作:返回 $this->container->get('templating')->renderResponse
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多