3

在 Symfony2 中,尝试渲染index.mobile.twig不存在时如何加载。index.html.twigindex.mobile.twig而是去得到一个“这个模板不存在错误”。

我相信答案在于为 Twig 创建自定义加载器,但我找不到任何文档,只是偶尔引用它。

4

2 回答 2

2

答案涉及在twig.loader.class发现特定的树枝模板不存在并且在抛出异常之前扩展并创建一个额外的步骤。

第 1 部分 - 配置

答案涉及扩展twig.loader.class.

  1. 创建一个customloader.php扩展 Twig 文件的FilesystemLoader文件。

    namespace Acme\MyBundle\Twig\Loader;       
    use Symfony\Bundle\TwigBundle\Loader\FilesystemLoader;
    class CustomLoader extends FilesystemLoader{}
    
  2. 修改您的config.yml以包括:

参数:
     twig.loader.class: Acme\YourBundle\Twig\Loader\name_of_your_class

第 2 部分 - 扩展课程

扩展类相当简单。我需要修改的方法是findTemplate($template). 这是一个非常小的方法,您可能可以使用它parent::来更正确地扩展原始代码。但是,我选择完全覆盖它并在Unable to find template错误之前包含以下代码:

    if (false === $file || null === $file) {

        switch( $template->get('format')){
            case 'mobile':
                    $template->set('format','html');
                    return self::findTemplate($template->getLogicalName());
                break;
        }

        throw new \Twig_Error_Loader(sprintf('Unable to find template "%s".', $logicalName), -1, null, $previous);

在代码意识到文件存在后,它会检查是否mobile是请求的格式。如果是,它将模板对象的格式设置为html,然后尝试name.html.twig. 在这方面你可以做更多的事情,但这解决了我的问题。

于 2012-09-24T16:43:11.307 回答
1

您可以尝试捕获由 twig 引发的异常,并使用其他模板在 catch 范围内重试它。

当模板不存在时,twig 会抛出 InvalidArgumentException,但我不确定这是否也与其他错误一起抛出。

但无论如何,尝试类似:

try {
    $template = $this->render('index.mobile.twig');
} catch (\InvalidArgumentException $exc) {
    $template = $this->render('index.html.twig');
}
return $template;
于 2012-09-21T14:53:10.297 回答