php – symfony 2はユーザーエージェントのプロパティに応じて異なるテンプレートをロードします

それは可能ですか(そしてどのように)

>ユーザーがモバイルデバイスを使用しているかどうかを判断する
>その場合はsymfony 2に異なるテンプレートをロードさせる
>(そしてデフォルトのhtmlテンプレートに戻ります)

やりたいことは、コントローラを変更せずに異なるテンプレートをロードすることです。

更新

ここでの本当の問題は検出部分ではありませんでした。Symfonyとは関係ありません。それはコントローラレベルで(異なるテンプレートを読み込む)することができます:

public function indexAction()
{
    $format = $this->isMobile() ? 'mob' : 'html';
    return $this->render('AcmeBlogBundle:Blog:index.'.$format.'.twig');
}

しかし、それは世界的に可能でしょうか?サービス、またはすべての要求の前に実行され、テンプレート規則に変更を加えるもののように。

ベストアンサー
わかりました、それで私は完全な解決策を持っていません、しかし、1つを探す場所より少しだけ多くのものを持っています:)

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

ご覧のとおり、これは完全な解決策ではありませんが、少なくともこれが正しい方向を示すことを願っています。

編集:ちょうど要求を送信したデバイスに応じてテンプレートファイルをレンダリングするカスタムの小枝エンジンで、モバイル検出機能を備えたバンドルがあることがわかりました
私はそれを使ったことがないけれどZenstruckMobileBundle

転載記事の出典を記入してください: php – symfony 2はユーザーエージェントのプロパティに応じて異なるテンプレートをロードします - コードログ