在渲染之前检查模板是否存在

时间:2013-05-25 16:05:59

标签: symfony twig transclusion

有没有办法在调用渲染之前检查twig模板是否存在? try catch块似乎不起作用,至少在开发环境中,而且,我更喜欢检查而不是异常的成本。

此类TwigEngine有一个exists()方法,但在使用时没有找到示例。

6 个答案:

答案 0 :(得分:65)

如果配置为默认值,则持有树枝引擎的服务是“模板化”。

在Controller内部执行以下操作:

if ( $this->get('templating')->exists('AcmeDemoBundle:Foo:bar.html.twig') ) {
     // ...
}

替代方法是捕获异常,render()方法抛出如下:

 try {
      $this->get('templating')->render('AcmeDemoBundle:Foo:bar.html.twig')
  } catch (\Exception $ex) {
     // your conditional code here.
  }

在普通控制器中......

$this->render('...')

只是...的别名

$this->container->get('templating')->renderResponse($view, $parameters, $response);

......而......

$this->get('...') 

...是

的别名
$this->container->get('...')

查看Symfony\FrameworkBundle\Controller\Controller

答案 1 :(得分:18)

如果您需要从twig模板内部检查模板是否存在,则必须使用数组包含方法,如documentation中所述:

{% include ['page_detailed.html', 'page.html'] %}

答案 2 :(得分:12)

将来的Symfony版本中将删除templating服务。基于twig服务的面向未来的解决方案是:

if ($this->get('twig')->getLoader()->exists('AcmeDemoBundle:Foo:bar.html.twig')) {
    // ...
}

答案 3 :(得分:8)

也许也是一个选择:

{% include 'AcmeDemoBundle:Foo:bar.html.twig' ignore missing %}

当找不到模板时,忽略遗漏添加会告诉twig什么都不做。

答案 4 :(得分:0)

你可以使用依赖注入这样做:

use Symfony\Component\Templating\EngineInterface;

public function fooAction(EngineInterface $templeEngine)
{
    if ($templeEngine->exists("@App/bar/foo.html.twig")) {
        // ...
    }
    // ...
}

使用Symfony 3.4测试。

答案 5 :(得分:0)

作为@ javier-eguiluz,您可以使用依赖项注入,获取存储Twig配置的环境。像这样

  /**
 * @Route("/{path}",methods={"GET"}, name="Home")
 * @param Request $request
 * @param $path
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function index(Request $request,$path,Environment $engine)
{

    if (!$engine->getLoader()->exists('pages/'.$path.'.html.twig')){
        return $this->render('pages/404.html.twig');
    }



}