TRAJOIN is an Application to Translate symfony documents Jointly.
home > 1.2/cookbook/en > iphone.txt
[1] Edit ↑TOPsymfony 1.1は異なるフォーマットとmime-typeのためのネイティブのサポートを導入します。このことは同じモデルとコントローラはリクエストされたフォーマットに基づいて異なるテンプレートを持つことを意味します。デフォルトのフォーマットはHTMLのままですが、symfonyは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
それぞれのフォーマットは1つもしくは複数のmime-typeに関連付けされます。これらのmime-typeはHTTPのAcceptヘッダーを解析することで自動的にリクエストされたフォーマットを決定するために使われます。ブラウザを通してデータを利用可能なものにしてウェブサービスとして公開したい場合これはとても重宝します。レスポンスのフォーマットを変更するためには、ウェブサービスのクライアントは下記のようにAcceptヘッダーを変更するだけです:
$ curl -H "Accept: application/xml" http://ws.example.com/api/article # データのXML表現を取得するため
$ curl -H "Accept: application/json" http://ws.example.com/api/article # データのJSON表現を取得するため
異なるフォーマットをサポートすることは異なるテンプレートを作ることと同じぐらい簡単です。ウェブサービスがapi/article アクションによって管理されることを前提とします。HTML、XML、とJSONフォーマットをサポートするために、apps/frontend/modules/api/templates内で作らなければならないテンプレートの一覧です:
デフォルトでは、symfonyは、フォーマットに従って、HTMLではないすべてのフォーマットのためにContent-Typeレスポンスの変更を行い、レイアウトは無効になります。パーシャルとレイアウトでさえもリクエストされたフォーマットに基づいて異なることがあります。例えば、listパーシャルをテンプレート内に含める場合、ロードされたパーシャル名は現在のフォーマットに依存します:
別の例を考えてみましょう。スタイルシートもしくはJavaScriptファイルをすぐに作りたいとします。これらの事例においてHTTPのAcceptヘッダーに常に依存できないので、ルーティングルール内でsf_format変数を利用することでフォーマットを強制できます。動的なスタイルシートのためのrouteを作る方法です:
css1:
url: /css/dynamic1.css
param: { module: css, action: dynamic, sf_format: css }
1つのアクションに対していくつかのフォーマットを許可するためにURLのパターン内でsf_format変数を使うこともできます:
api_article:
url: /api/article.:sf_format
param: { module: api, action: article }
requirements:
sf_format: (?:html|xml|json)
大抵の場合、新しいフォーマットをサポートするためにアクション内のコードを変更する必要はありません; しかしフォーマットのために何か特別なことを本当に行う必要がある場合、現在のフォーマットを取得してそれに応じて振る舞うために$request->getRequestFormat()を呼び出すことができます。
Ok、楽しい部分をやってみましょう!iPhoneのために最適化されたバージョンのウェブサイトを作りたい場合を考えてみましょう。デフォルトではiphoneのフォーマットは存在しませんが設定するのはかなり簡単です。最初に、iPhoneから由来するリクエストを決定する方法が必要です。User-AgentヘッダーがMobileと Safariの単語を含む場合、ブラウザがiPhoneであると無事に推測できます。request.filter_parametersイベントのためのリスナーを登録することでこのロジックをProjectConfigurationクラスに設置できます:
// 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;
}
}
では、リクエストが来るたびに、filterParameters()メソッドが呼び出されブラウザがiPhoneの場合、リクエストフォーマットはiphoneに変更されます。
これでお終いです!iPhoneから来るすべてのリクエストは*Success.phpテンプレートの代わりに*Success.iphone.phpテンプレートを使います。
iPhoneのために特別なスタイルシートもしくはJavaScriptファイルを使いたい場合(例えばiui libraryを使う場合)、view.configure_formatをリスニングすることでビューを設定することもできます:
class ProjectConfiguration extends sfProjectConfiguration
{
public function setup()
{
// ...
$this->dispatcher->connect('view.configure_format', array($this, 'configureIPhoneFormat'));
}
public function configureIPhoneFormat(sfEvent $event)
{
if ('iphone' == $event['format'])
{
// add some CSS, javascript, or whatever you want
}
}
}
Thanks to the new format support since symfony 1.1, developing websites that supports Web Services, API or the iPhone has never been easier. Supporting a new format is as easy as creating a new set of templates.
Documentation
| Thanks to the new format ... | |
| brtRiver(2009-01-05 03:48:33) | |
| [php] class Proje ... | |
| brtRiver(2009-01-05 03:48:24) | |
| If you use some special s ... | |
| brtRiver(2009-01-05 03:48:03) | |
| That's all! Now, eve ... | |
| brtRiver(2009-01-05 03:47:46) | |
| Now, everytime a request ... | |
| brtRiver(2009-01-05 03:47:21) | |
| [php] // config/P ... | |
| brtRiver(2009-01-05 03:47:12) | |
| Ok, now for the fun part! ... | |
| brtRiver(2009-01-05 03:46:57) | |
| Most of the time, you don ... | |
| brtRiver(2009-01-05 03:46:46) | |
| [yml] api_article ... | |
| brtRiver(2009-01-05 03:46:38) | |
| You can also use the `sf_ ... | |
| brtRiver(2009-01-05 03:46:30) | |
| [yml] css1: ... | |
| brtRiver(2009-01-05 03:46:18) | |
| Let's take another e ... | |
| brtRiver(2009-01-05 03:46:06) | |
| * _list.php * _list.x ... | |
| brtRiver(2009-01-05 03:45:57) | |
| By default, symfony will ... | |
| brtRiver(2009-01-05 03:45:48) | |
| * articleSuccess.php ... | |
| brtRiver(2009-01-05 03:45:40) | |
| Supporting different form ... | |
| brtRiver(2009-01-05 03:45:29) | |
| $ curl -H "Accep ... | |
| brtRiver(2009-01-05 03:45:19) | |
| Each format is associated ... | |
| brtRiver(2009-01-05 03:45:07) | |
| [yml] request: ... | |
| brtRiver(2009-01-05 03:44:54) | |
| symfony 1.1 introduces na ... | |
| brtRiver(2009-01-05 03:44:43) |