如何在symfony 1.1中创建您的iPhone网站的优化版本ob娱乐下载
ob娱乐下载Symfony 1.1引入了对不同格式和mime类型的本地支持。这意味着相同的模型和控制器可以根据请求的格式拥有不同的模板。的默认格式仍然是HTML,但是symfony支持其他几种开箱即用的格式ob娱乐下载factories.yml
文件:
request: class: sfWebRequest param: formats: txt: text/plain js: [application/javascript, application/x-javascript, text/javascript] css: text/css json: [application/json, application/x-json] xml: [text/xml, application/xml, application/x-xml] rdf: application/rdf+xml atom: application/atom+xml
每种格式都与一种或多种mime类型相关联。类型来自动确定所请求的格式接受
HTTP报头。如果您希望通过浏览器提供数据并将其作为Web服务公开,这就非常方便了。要更改响应的格式,Web服务客户机只需更改接受
标题如下所示:
$ curl -H "Accept: application/xml" http://ws.example.com/api/article #获取数据的xml表示形式$ curl -H "Accept: application/json" http://ws.example.com/api/article #获取数据的json表示形式
支持不同格式就像创建不同模板一样简单。假设web服务是由api /条
行动。下面是您必须在其中创建的模板列表应用程序/前端/模块/ api /模板
支持HTML、XML和JSON格式:
- articleSuccess.php
- articleSuccess.xml.php
- articleSuccess.json.php
默认情况下,symfonob娱乐下载y将更改响应内容类型
对于所有非html格式,该布局将被禁用。甚至部分和布局也可以根据所请求的格式而有所不同。例如,如果你包含一个列表
在模板中,加载的部分名称将取决于当前格式:
- _list.php
- _list.xml.php
- _list.json.php
让我们再举一个例子。您希望动态地创建一些样式表或JavaScript文件。因为你不能总是依赖浏览器接受
对于这些情况,您可以使用特殊的sf_format
路由规则中的变量。下面是如何为动态样式表创建路由:
Css1: url: /css/dynamic1.css参数:{模块:css,动作:动态,sf_format: css}
你也可以使用sf_format
变量,允许一个动作有多种格式:
Api_article: url: /api/article。:sf_formatparam: { module: api, action: article } requirements: sf_format: (?:html|xml|json)
大多数情况下,你不需要改变动作中的任何一行来支持新格式;但是,如果确实需要为某种格式做一些特殊的事情,可以调用请求- > getRequestFormat ()
获取当前格式并相应地执行。
好了,现在开始有趣的部分!假设你想为iPhone创建一个优化版的网站。的iphone
Format在默认情况下并不存在,但是配置它非常容易。首先,我们需要一种方法来确定请求来自iPhone。如果用户代理
标头包含以下单词移动
而且Safari
,我们可以有把握地猜测浏览器是iPhone。我们可以把这个逻辑放到ProjectConfiguration
类的侦听器注册request.filter_parameters
事件:
/ /配置/ ProjectConfiguration.class.php类ProjectConfiguration扩展sfProjectConfiguration{公共函数设置(){/ /……这个美元->调度程序->连接(“request.filter_parameters”,数组(这个美元,“filterRequestParameters”));}公共函数filterRequestParameters(sfEvent美元的事件,美元的参数){美元的请求=美元的事件->getSubject();如果(preg_match(“#移动/ + Safari #我'。,美元的请求->getHttpHeader(“用户代理”))){美元的请求->setRequestFormat(“iphone”);}返回美元的参数;}}
现在,每当一个请求进来,filterParameters ()
方法被调用,如果浏览器是iPhone,请求格式被更改为iphone
.
这是所有!现在,来自iPhone的每个请求都将使用* Success.iphone.php
模板而不是* Success.php
模板。
如果您使用一些特殊的JavaScript文件样式表来支持iPhone(例如,如果您使用iui图书馆),您也可以通过侦听view.configure_format
:
类ProjectConfiguration扩展sfProjectConfiguration{公共函数设置(){/ /……这个美元->调度程序->连接(“view.configure_format”,数组(这个美元,“configureIPhoneFormat”));}公共函数configureIPhoneFormat(sfEvent美元的事件){如果(“iphone”= =美元的事件[“格式”]){//添加一些CSS,样式表,或任何你想要的}}}
今天,苹果公司推出了新款iPhone 2.为了庆祝这一事件,我很高兴地宣布,symfony API文档现在已经可以在带有特定接口的iPhone上使用,如下面的ob娱乐下载截图所示。欧宝官网下载app
由于symfony 1.1中的新格式支持,开发支持Web服务、API或iob娱乐下载Phone的网站变得前所未有的简单。支持新格式就像创建一组新模板一样简单。享受吧!
评论
评论截止。
为了确保评论保持相关性,旧帖子将被关闭。
Sf仍然是最好的
谢谢这个漂亮的框架!
不仅仅是一个框架,更是一种生活方式!
谢谢你!
方法名'filterRequestParameters'与连接调用'filterParameters'中的方法名不匹配。
我需要替换'$dispatcher'与'$this->dispatcher' -也许这是暗示'//…'?
你还需要创建一个名为layout。iphone。php的布局。
:)
除此之外,它太棒了!
/ /配置/ ProjectConfiguration.class.php
类ProjectConfiguration扩展了sfProjectConfiguration
{
公共函数设置()
{
/ /……
$ this - >调度程序- >连接(“请求。filter_parameters',数组($this, 'filterRequestParameters'));
}
公共函数filterRequestParameters(sfEvent $event, $parameters)
{
$request = $event->getSubject();
如果(preg_match(#移动/。+ Safari #我,请求- > getHttpHeader(“用户代理”)))
{
请求- > setRequestFormat(“iphone”);
}
返回参数美元;
}
}
期待开始使用1.1。
验证器是否适用于此?
是否有一些文档关于自定义sfProjectConfiguration和那些事件的解释列表,如view。Configure_format你可以修改?
http://www.ob娱乐下载symfony-project.org/book/1_1/17-Extending-Symfony#Built-In%20Events
我期待1.1稳定版的发布。
我猜想iPhone的东西同样适用于iPod-Touch,因为后者基于与iPhone相同的软件系统(例如Mobile Safari)。
欢呼声拉斐尔
url: / api /文章:.sf_format
应该是:
url: / api /条。: sf_format ?
你可以为小屏幕做一个网站。但是为一个特定的设备创建一个网站是非常糟糕的做法。
iPhone支持@media CSS-rules。如果你想为小屏幕安排东西,这应该是第一选择。顺便提一下,Opera也支持它,Firefox 3.1也将支持它,因此Fennec也支持它。
在工作中使用错误的工具是不可取的,即使该工具设计得非常好。
a.如果你的页面非常臃肿,你必须使用不同的HTML输出,我认为你需要认真的IA重构。
b.苹果营销的重点是iPhone不应该得到一个网站的移动专用版本。他们特别选择不尊重@media手持设备,而是使用@media屏幕规则。通过使用这样的设备,客户可以选择查看完整版本。因此:如果需要调整,请使用“@media screen and max-width()”。
顺便说一句,这也适用于Opera Mini和Opera Mobile的所有用户(Opera Mini的用户比iPhone的用户多!),以及即将推出的Fennec。
c. UA嗅探已被证明是一个排除一切合理怀疑的错误解决方案。这只会导致ua欺骗。我们以前真的去过那里!重复以前的错误,却期待不同的结果是愚蠢的。
所以:
如果你真的必须向移动设备发送替代内容(不仅仅是iPhone),最不糟糕的解决方案是使用不同的URL,让用户自己选择。
当然,当手机版在谷歌上排名更高时,这可能会带来惊喜。就像今天许多网站使用错误的“印刷版本”体验一样。
但就像我一开始说的。如果你的IA不好,那就是你应该解决问题的地方。这总比创造新的好。