OGeek|极客世界-中国程序员成长平台

标题: php - Symfony 2 根据用户代理属性加载不同的模板 [打印本页]

作者: 菜鸟教程小白    时间: 2022-8-14 07:38
标题: php - Symfony 2 根据用户代理属性加载不同的模板

是否有可能(以及如何)

  • 确定用户是否正在使用移动设备
  • 在这种情况下强制 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/






    欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4