TRAJOIN is an Application to Translate symfony documents Jointly.

home > 1.2/cookbook/en > iphone.txt

Edit this page

Show Markdown text

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


symfony 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内で作らなければならないテンプレートの一覧です:


  • articleSuccess.php
  • articleSuccess.xml.php
  • articleSuccess.json.php

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


  • _list.php
  • _list.xml.php
  • _list.json.php

別の例を考えてみましょう。スタイルシートもしくは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ヘッダーがMobileSafariの単語を含む場合、ブラウザが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.


Show Markdown text

Menu

Documentation



block contents