• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

php - Symfony 2 根据用户代理属性加载不同的模板

[复制链接]
菜鸟教程小白 发表于 2022-8-14 07:38:17 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

是否有可能(以及如何)

  • 确定用户是否正在使用移动设备
  • 在这种情况下强制 symfony 2 加载不同的模板
  • (并回退默认的 html 模板)

  • id 喜欢做的是,在不修改任何 Controller 的情况下加载不同的模板。

    更新

    真正的问题不是检测部分,它实际上与 symfony 无关。它可以在 Controller 级别完成(加载不同的模板):
    public function indexAction()
    {
        $format = $this->isMobile() ? 'mob' : 'html';
        return $this->render('AcmeBlogBundle:Blog:index.'.$format.'.twig');
    }
    

    但它可以在全局范围内完成吗?就像一个服务,或者在每个请求之前执行的东西,并在模板规则中进行更改。



    Best Answer-推荐答案


    好的,所以我没有完整的解决方案,但比在哪里寻找解决方案要多一点

    您可以在 app/config/config.yml 中为模板项指定加载器(服务)

    framework:
        esi:             { enabled: true }
        #translator:     { fallback: %locale% }
        secret:          %secret%
        router:
            resource: "%kernel.root_dir%/config/routing.yml"
            strict_requirements: %kernel.debug%
        form:            true
        csrf_protection: true
        validation:      { enable_annotations: true }
        templating:       
            engines: 
               - twig 
            loaders:  [moby.loader]
        default_locale:  %locale%
        trust_proxy_headers: false
        session:         ~
    

    然后定义提到的加载器服务:
    services:
        moby.loader:
            class: Acme\AppBundle\Twig\Loader\MobyFilesystemLoader
            arguments:    ["@templating.locator", "@service_container"]
    

    之后定义您的加载器服务类:
    namespace Acme\AppBundle\Twig\Loader;
    
    use Symfony\Bundle\FrameworkBundle\Templating\Loader\FilesystemLoader;
    use Symfony\Component\Templating\Storage\FileStorage;
    
    
    class MobyFilesystemLoader extends FilesystemLoader
    {
         protected $container;
    
         public function __construct($templatePathPatterns, $container) 
         {
             parent::__construct($templatePathPatterns);
             $this->container = $container;
         }
    
         public function load(\Symfony\Component\Templating\TemplateReferenceInterface $template)
         {
             // Here you can filter what you actually want to change from html
             // to mob format
             // ->get('controller') returns the name of a controller
             // ->get('name')  returns the name of the template
             if($template->get('bundle') == 'AcmeAppBundle') 
             {
                $request = $this->container->get('request');
                $format = $this->isMobile($request) ? 'mob' : 'html';
    
                $template->set('format', $format);
             }
    
             try {
                $file = $this->locator->locate($template);
             } catch (\InvalidArgumentException $e) {
                return false;
             }
    
             return new FileStorage($file);
          }
    
          /**
           * Implement your check to see if request is made from mobile platform
           */
           private function isMobile($request)
           {
               return true;
           }
     }
    

    正如您所看到的,这不是完整的解决方案,但我希望这至少可以为您指明正确的方向。

    编辑:刚刚发现有一个具有移动检测功能的捆绑包,带有自定义 Twig 引擎,可根据发送请求的设备呈现模板文件
    ZenstruckMobileBundle ,虽然我从来没有用过它...

    关于php - Symfony 2 根据用户代理属性加载不同的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8257676/

    回复

    使用道具 举报

    懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关注0

    粉丝2

    帖子830918

    发布主题
    阅读排行 更多
    广告位

    扫描微信二维码

    查看手机版网站

    随时了解更新最新资讯

    139-2527-9053

    在线客服(服务时间 9:00~18:00)

    在线QQ客服
    地址:深圳市南山区西丽大学城创智工业园
    电邮:jeky_zhao#qq.com
    移动电话:139-2527-9053

    Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap