是否可能(以及如何)
确定用户是否正在使用移动设备
强制symfony 2在这种情况下加载不同的模板
(并回退默认的html模板)
我喜欢做的是,在不修改任何控制器的情况下加载不同的模板.
UPDATE
这不是检测部分真正的问题,它与symfony无关.它可以在控制器级别上完成(加载不同的模板):
public function indexAction() { $format = $this->isMobile() ? 'mob' : 'html'; return $this->render('AcmeBlogBundle:Blog:index.'.$format.'.twig'); }
但它可以在全球范围内完成吗?就像服务,或者在每个请求之前执行的东西,并在模板规则中进行更改.
好的,所以我没有一个完整的解决方案,但比在哪里寻找一个:)
您可以在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的设备呈现模板文件 ,虽然我从未使用过它... :)
好吧,你可以使用LiipThemeBundle.