如何在Symfony 1.4中实现Mobile版本



实现在Symfony 1.4中开发的Web应用程序的MobileVersion的最佳方法是什么?我在谷歌上搜索,但没有成功。

真的不知道如何开始,也不知道是否有任何标准可以遵循。我应该只实现不同的模板还是完全不同的应用程序(比如前端/后端)。

我的第一个问题是实现一个过滤器,它将像onRequest侦听器一样,如果用户代理是移动的,则重定向到移动应用程序。但我认为,通过这种方式(使用不同的应用程序),很难从手机版本迁移到浏览器版本,反之亦然。

这几乎正是symfony网站上对它的定义。

查看文章:如何在symfony 1.1中为iPhone创建网站的优化版本,特别是这一部分:

// 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上查看完整的网站。为此,您应该使用带有类似?doaction=read_on_site的参数的会话来处理它,然后在filterRequestParameters中设置cookie和检查。

编辑:

使用过滤器会更容易。轻松访问请求和响应

<?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检测或类似的库,这会给您带来更大的灵活性。

您还可以查看本教程中的sfView补丁,当没有定义iphone视图时,该补丁可以回退到默认视图。它非常有用。

最新更新