45

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

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

4

6 回答 6

68

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

在控制器内部执行以下操作:

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

于 2013-05-25T16:10:40.607 回答
36

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

if ($this->get('twig')->getLoader()->exists('AcmeDemoBundle:Foo:bar.html.twig')) {
    // ...
}
于 2017-02-06T20:58:40.143 回答
25

如果您需要从树枝模板中检查模板是否存在,您必须使用数组包含方法,如文档中所述:

{% include ['page_detailed.html', 'page.html'] %}
于 2015-01-12T22:21:16.853 回答
21

也许也是一个选择:

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

当找不到模板时,忽略缺失的添加告诉 twig 什么都不做。

于 2016-09-20T13:41:57.817 回答
2

您可以使用依赖注入来做到这一点:

use Symfony\Component\Templating\EngineInterface;

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

用 Symfony 3.4 测试。

于 2018-01-18T02:36:50.250 回答
1

您可以使用依赖注入来获取存储 Twig 配置的环境。像这样(在控制器中):

/**
 * @Route("/{path}")
 */
public function index($path, Twig\Environment $env)
{
    if (!$env->getLoader()->exists('pages/'.$path.'.html.twig')) {
        return $this->render('pages/404.html.twig');
    }
}
于 2019-10-17T07:31:30.793 回答