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

来自自定义位置的Symfony渲染模板,symfony,twig,absolute-path,Symfony,Twig,Absolute Path,我试图不使用Symfony2所需的格式“Bundle:Controller:file_name”来呈现模板,但希望从某个自定义位置呈现模板 控制器中的代码引发异常 可捕获的致命错误:类的对象 __TwigTemplate_509979806d1e38b0f3f78d743b547a88无法在中转换为字符串 Symfony/vendor/Symfony/Symfony/src/Symfony/Bundle/TwigBundle/Debug/timedtwigine.php 第50行 我的代码: $

我试图不使用Symfony2所需的格式“Bundle:Controller:file_name”来呈现模板,但希望从某个自定义位置呈现模板

控制器中的代码引发异常

可捕获的致命错误:类的对象 __TwigTemplate_509979806d1e38b0f3f78d743b547a88无法在中转换为字符串 Symfony/vendor/Symfony/Symfony/src/Symfony/Bundle/TwigBundle/Debug/timedtwigine.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中执行这些操作,还是只使用逻辑名称格式?

解决方案

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

不要忘记放置
使用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告诉您它需要一个字符串,该字符串是视图名称,而不是实际的模板。如您所见,它使用
模板化服务,并简单地来回传递参数和返回值

运行
php应用程序/控制台容器: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
对象,setContent是在该对象上执行的,使用一个表示模板的字符串


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

感谢您的回答,我从中得到的主要内容是一个php应用程序/控制台容器:调试。以前我尝试获取加载程序和细枝环境,但没有成功,这就是为什么我尝试创建一个新的环境和加载程序实例。为我工作:return$this->container->get('templating')->renderResponselook查看这个实例
/**
 * 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;
}