编程语言
首页 > 编程语言> > php-Symfony2->如果请求的格式(例如移动电话)不存在,则呈现默认格式(例如html)

php-Symfony2->如果请求的格式(例如移动电话)不存在,则呈现默认格式(例如html)

作者:互联网

在Symfony2中,当尝试呈现index.mobile.twig时,当index.mobile.twig不存在时如何加载index.html.twig.而是获取“此模板不存在错误”.

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

解决方法:

答案包括扩展twig.loader.class并在发现特定的twig模板不存在之后并且在引发Exception之前创建一个附加步骤.

第1部分-配置

答案包括扩展twig.loader.class.

>创建一个customloader.php来扩展Twig FilesystemLoader文件.

namespace Acme\MyBundle\Twig\Loader;       
use Symfony\Bundle\TwigBundle\Loader\FilesystemLoader;
class CustomLoader extends FilesystemLoader{}

>修改您的config.yml以包括:

 parameters: 
     twig.loader.class: Acme\YourBundle\Twig\Loader\name_of_your_class

第2部分-扩展课程

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

    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);

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

标签:symfony,twig,php
来源: https://codeday.me/bug/20191127/2075525.html