如何在Symfony 1.4中实现移动版?

时间:2012-09-10 10:02:32

标签: php mobile symfony1 symfony-1.4

实现Symfony 1.4中开发的WebApplication的MobileVersion的最佳方法是什么?我在谷歌搜索但没有成功。

不知道如何开始或者是否有任何标准要遵循。我应该只实现不同的模板或完全不同的应用程序(如前端/后端)。

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

2 个答案:

答案 0 :(得分:4)

这几乎就是在symfony网站上定义的方式。

检查文章:How to create an optimized version of your website for the 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上查看完整的网站一样。为此,您应该使用带有?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();
  }
}

答案 1 :(得分:2)

我同意过滤方式,效果很好。

您应该使用Mobile detect或类似的库,而不是使用手动检测,它会为您提供更大的灵活性。

您还可以查看this tutorial,了解在未定义iphone视图时回退到默认视图的sfView补丁。这非常有用。