实现在 Symfony 1.4 中开发的 Web 应用程序的 MobileVersion 的最佳方式是什么?我在谷歌上搜索但没有成功。
真的不知道如何开始,或者是否有任何标准可以遵循。我应该只实现不同的模板还是完全不同的应用程序(如前端/后端)。
我的第一个问题是实现一个过滤器,它就像一个 onRequest 侦听器,如果用户代理是移动的,则重定向到移动应用程序。但我认为以这种方式(使用不同的应用程序)很难从移动版本迁移到浏览器版本,反之亦然。
实现在 Symfony 1.4 中开发的 Web 应用程序的 MobileVersion 的最佳方式是什么?我在谷歌上搜索但没有成功。
真的不知道如何开始,或者是否有任何标准可以遵循。我应该只实现不同的模板还是完全不同的应用程序(如前端/后端)。
我的第一个问题是实现一个过滤器,它就像一个 onRequest 侦听器,如果用户代理是移动的,则重定向到移动应用程序。但我认为以这种方式(使用不同的应用程序)很难从移动版本迁移到浏览器版本,反之亦然。
这几乎就是 symfony 网站上定义的方式。
查看文章:How to create an optimization version of your website for iPhone in symfony 1.1,特别是这部分:
// config/ProjectConfiguration.class.php
class ProjectConfiguration extends sfProjectConfiguration
{
public function setup()
{
// ...
$this->dispatcher->connect('request.filter_parameters', array($this, 'filterRequestParameters'));
}
public function filterRequestParameters(sfEvent $event, $parameters)
{
$request = $event->getSubject();
if (preg_match('#Mobile/.+Safari#i', $request->getHttpHeader('User-Agent')))
{
$request->setRequestFormat('iphone');
}
return $parameters;
}
}
现在,来自 iPhone 的每个请求都将使用 *Success.iphone.php 模板而不是 *Success.php 模板。
正如您所说,从一个环境切换到另一个环境会更加困难。就像从 iPhone 上查看完整的网站一样。为此,您应该使用带有参数的 session 来处理它?doaction=read_on_site
,设置一个 cookie 并在filterRequestParameters
.
编辑:
改用过滤器会更容易。轻松访问请求和响应
<?php
class iPhoneFilter extends sfFilter
{
public function execute ($filterChain)
{
// get the cool stuff
$context = $this->getContext();
$request = $context->getRequest();
$response = $context->getResponse();
if ($this->isFirstCall())
{
$cookies = $response->getCookies();
if (preg_match('#Mobile/.+Safari#i', $request->getHttpHeader('User-Agent'))
&& ! isset($cookies['doaction']))
{
$request->setRequestFormat('iphone');
}
}
// execute next filter
$filterChain->execute();
}
}
我同意过滤方式,效果很好。
您应该使用Mobile detect或类似的库,而不是使用手动检测,它为您提供了更大的灵活性。
您还可以查看本教程中的 sfView 补丁,当 iPhone 视图未定义时回退到默认视图很有趣。这是非常有用的。