TRAJOIN is an Application to Translate symfony documents Jointly.

home > 1.2/cookbook/en > iphone.txt

[1] Edit ↑TOP

iPhoneのために最適化されたウェブサイトを作る方法


[2] Edit ↑TOP

symfony 1.1は異なるフォーマットとmime-typeのためのネイティブのサポートを導入します。このことは同じモデルとコントローラはリクエストされたフォーマットに基づいて異なるテンプレートを持つことを意味します。デフォルトのフォーマットはHTMLのままですが、symfonyはfactories.ymlファイル内で定義されたものとしていくつかの他のフォーマットをそのままサポートします:


[3] Edit ↑TOP

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

[4] Edit ↑TOP

それぞれのフォーマットは1つもしくは複数のmime-typeに関連付けされます。これらのmime-typeはHTTPのAcceptヘッダーを解析することで自動的にリクエストされたフォーマットを決定するために使われます。ブラウザを通してデータを利用可能なものにしてウェブサービスとして公開したい場合これはとても重宝します。レスポンスのフォーマットを変更するためには、ウェブサービスのクライアントは下記のようにAcceptヘッダーを変更するだけです:


[5] Edit ↑TOP
$ curl -H "Accept: application/xml"  http://ws.example.com/api/article # データのXML表現を取得するため
$ curl -H "Accept: application/json" http://ws.example.com/api/article # データのJSON表現を取得するため

[6] Edit ↑TOP

異なるフォーマットをサポートすることは異なるテンプレートを作ることと同じぐらい簡単です。ウェブサービスがapi/article アクションによって管理されることを前提とします。HTML、XML、とJSONフォーマットをサポートするために、apps/frontend/modules/api/templates内で作らなければならないテンプレートの一覧です:


[7] Edit ↑TOP
  • articleSuccess.php
  • articleSuccess.xml.php
  • articleSuccess.json.php

[8] Edit ↑TOP

デフォルトでは、symfonyは、フォーマットに従って、HTMLではないすべてのフォーマットのためにContent-Typeレスポンスの変更を行い、レイアウトは無効になります。パーシャルとレイアウトでさえもリクエストされたフォーマットに基づいて異なることがあります。例えば、listパーシャルをテンプレート内に含める場合、ロードされたパーシャル名は現在のフォーマットに依存します:


[9] Edit ↑TOP
  • _list.php
  • _list.xml.php
  • _list.json.php

[10] Edit ↑TOP

別の例を考えてみましょう。スタイルシートもしくはJavaScriptファイルをすぐに作りたいとします。これらの事例においてHTTPのAcceptヘッダーに常に依存できないので、ルーティングルール内でsf_format変数を利用することでフォーマットを強制できます。動的なスタイルシートのためのrouteを作る方法です:


[11] Edit ↑TOP

css1:
  url:   /css/dynamic1.css
  param: { module: css, action: dynamic, sf_format: css }

[12] Edit ↑TOP

1つのアクションに対していくつかのフォーマットを許可するためにURLのパターン内でsf_format変数を使うこともできます:


[13] Edit ↑TOP

api_article:
  url:   /api/article.:sf_format
  param: { module: api, action: article }
  requirements:
    sf_format: (?:html|xml|json)

[14] Edit ↑TOP

大抵の場合、新しいフォーマットをサポートするためにアクション内のコードを変更する必要はありません; しかしフォーマットのために何か特別なことを本当に行う必要がある場合、現在のフォーマットを取得してそれに応じて振る舞うために$request->getRequestFormat()を呼び出すことができます。


[15] Edit ↑TOP

Ok、楽しい部分をやってみましょう!iPhoneのために最適化されたバージョンのウェブサイトを作りたい場合を考えてみましょう。デフォルトではiphoneのフォーマットは存在しませんが設定するのはかなり簡単です。最初に、iPhoneから由来するリクエストを決定する方法が必要です。User-AgentヘッダーがMobileSafariの単語を含む場合、ブラウザがiPhoneであると無事に推測できます。request.filter_parametersイベントのためのリスナーを登録することでこのロジックをProjectConfigurationクラスに設置できます:


[16] Edit ↑TOP

// 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;
  }
}

[17] Edit ↑TOP

では、リクエストが来るたびに、filterParameters()メソッドが呼び出されブラウザがiPhoneの場合、リクエストフォーマットはiphoneに変更されます。


[18] Edit ↑TOP

これでお終いです!iPhoneから来るすべてのリクエストは*Success.phpテンプレートの代わりに*Success.iphone.phpテンプレートを使います。


[19] Edit ↑TOP

iPhoneのために特別なスタイルシートもしくはJavaScriptファイルを使いたい場合(例えばiui libraryを使う場合)、view.configure_formatをリスニングすることでビューを設定することもできます:


[20] Edit ↑TOP

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
    }
  }
}

[21] Edit ↑TOP

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.


Comments

Menu

Documentation



Latest Histories

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)

Untranslated