2011/01/05

Symfony2 クイックツアー 第1部

日本Symfonyユーザ会にて日本語ドキュメントが公開されています。そちらを参考にしてください。
Symfony2 の全体像 | Symfony2日本語ドキュメント
http://docs.symfony.gr.jp/symfony2/quick_tour/the_big_picture.html
日本語訳(下書き):
Symfony - The Big Picture
http://symfony.com/doc/2.0/quick_tour/the_big_picture.html

1. 全体像

さあ、10 分で Symfony2 を使いこなしましょう! 本チュートリアルでは、Symfony2 のもっとも重要な概念を段階的に説明します。 それでは、サンプルプロジェクトの構造を見ながら、すばやく開始しましょう。

これまでに何らかの Web フレームワークを使ったことがあるなら、Symfony2 には苦労しないはずです。 もしまだなら、まったく新しい Web アプリケーション開発方法へようこそ!

1.1. Symfony2 のダウンロードとインストール

まずは、Web サーバ (Apache など) をインストールし、PHP 5.3.2 以降が動作するように設定しているかどうかを確認します。

用意できましたか? では、Symfony2 をダウンロードしましょう。 今すぐ始めるには、「Symfony2 sandbox」(訳注: sandbox は OBSOLETE CODE となり、代わりに Standard Edition の使用が推奨されています。ただし、クイックツアーの第1部では sandbox の内容が元になっているため、ところどころ記述が合わない部分があります。注意してください。) を使います。 これは、単純なコントローラと動作に必要なライブラリが含まれている、設定済みの Symfony2 プロジェクトになります。 sandbox の大きな利点は、他のインストール方法に比べ、即座に Symfony2 で検証作業を開始できることにあります。

sandbox をダウンロードし、Web の root ディレクトリ (訳注: ドキュメントルートのこと) に展開します。 これで、sandbox/ ディレクトリができるはずです:

www/ <- Web の root ディレクトリ
    sandbox/ <- 展開されたアーカイブ
        app/
            cache/
            config/
            logs/
        src/
            Sensio/
                HelloBundle/
                    Controller/
                    Resources/
        vendor/
            symfony/
            doctrine/
            ...
        web/

1.2. 設定の確認

Symfony2 では、Web サーバや PHP の設定ミスから生じる問題を回避するのに役立つ、仮想サーバの構成テスターが付属しています。 サーバの診断を参照するには、次の URL を使います:

http://localhost/sandbox/web/check.php

check.php スクリプトの出力を注意深く読み、未解決の問題をすべて修正してください。

これで、Symfony2 の「本当の」Web ページを、初めてリクエストできます:

http://localhost/sandbox/web/app_dev.php/

Symfony2 は、ここまで大変な作業をしてきたあなたに感謝してくれます!

1.3. 初めてのアプリケーション作成

sandbox には、簡単な Hello World 「アプリケーション」が同梱されており、Symfony2 を詳しく学ぶために用います。 Symfony2 によって生成された次の URL にアクセスしてみてください (Fabien をあなたの名前に置き換えて):

http://localhost/sandbox/web/app_dev.php/hello/Fabien

ここでは一体何が起きているのでしょうか? URL を分解してみましょう:

  • app_dev.php: これは「フロントコントローラ(front controller)」です。 フロントコントローラは、アプリケーションの唯一のエントリーポイントであり、ユーザのリクエストのすべてに応答します。
  • /hello/Fabien: これはユーザがアクセスしたいリソースへのバーチャルパス(virtual path)です。

開発者がすべきことは、ユーザのリクエスト (/hello/Fabien) を、関連するリソース (Hello Fabien!) に対応付けるためのコードを記述することになります。

1.3.1. 設定

Symfony2 設定ファイルは、PHP や XML または YAML で記述することができます。 さまざまな種類と互換性があり、アプリケーションではそれぞれ同等に使用できます。

sandbox では YAML をデフォルトにしていますが、app/AppKernel.php ファイルを開いて、registerContainerConfiguration メソッドを編集することで XML または PHP に簡単に変更することができます。(訳注: ここでの記載内容は sandbox 用になります。sandbox では、PHP や XML 用のファイルは既に用意されているので、コメントアウトされている部分を有効にすればすぐに使えましたが、Standard Edition では YAML のみしか用意されていません。)

1.3.2. ルーティング

Symfony2 は、ルーティング設定ファイルを用いて、あなたのコードにリクエストを配送しています。 アプリケーション用のルーティング設定ファイルの例を以下に示します:

# app/config/routing.yml
homepage:
    pattern:  /
    defaults: { _controller: FrameworkBundle:Default:index }

hello:
    resource: "@HelloBundle/Resources/config/routing.yml"
<!-- app/config/routing.xml -->
<?xml version="1.0" encoding="UTF-8" ?>

<routes xmlns="http://www.symfony-project.org/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.symfony-project.org/schema/routing http://www.symfony-project.org/schema/routing/routing-1.0.xsd">

    <route id="homepage" pattern="/">
        <default key="_controller">FrameworkBundle:Default:index</default>
    </route>

    <import resource="@HelloBundle/Resources/config/routing.xml" />
</routes>
// app/config/routing.php
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;

$collection = new RouteCollection();
$collection->add('homepage', new Route('/', array(
    '_controller' => 'FrameworkBundle:Default:index',
)));
$collection->addCollection($loader->import("@HelloBundle/Resources/config/routing.php"));

return $collection;

ルーティング設定ファイルの最初の数行では、パターンを指定した「/」リソース (すなわち、ホームページ) を、ユーザがリクエストするときに実行されるコードを定義しています。 ここでは、FrameworkBundle 内の Default コントローラの index メソッドを実行します。(訳注: sandbox の PR6 時点の情報です。PR7 では DefaultController.php はなくなりました。また、app/config/routing.php の記載内容も変更されています。)

次に、その設定ファイルの最後のディレクティブを見てください: Symfony2 では、import ディレクティブを用いて、別のルーティング設定ファイルから、ルーティング情報をインクルードすることができます。(訳注: YAML でいうところの、import ディレクティブは、「resource: "@~"」部分になります。) この例では、HelloBundle からルーティング設定をインポートしています。 バンドルとはプラグインを強力にしたようなものです。後で詳しく説明します。 とりあえず、インポートしたルーティング設定の内容を見てみましょう:

# src/Sensio/HelloBundle/Resources/config/routing.yml
hello:
    pattern:  /hello/{name}
    defaults: { _controller: HelloBundle:Hello:index }
<!-- src/Sensio/HelloBundle/Resources/config/routing.xml -->
<?xml version="1.0" encoding="UTF-8" ?>

<routes xmlns="http://www.symfony-project.org/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.symfony-project.org/schema/routing http://www.symfony-project.org/schema/routing/routing-1.0.xsd">

    <route id="hello" pattern="/hello/{name}">
        <default key="_controller">HelloBundle:Hello:index</default>
    </route>
</routes>
// src/Sensio/HelloBundle/Resources/config/routing.php
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;

$collection = new RouteCollection();
$collection->add('hello', new Route('/hello/{name}', array(
    '_controller' => 'HelloBundle:Hello:index',
)));

return $collection;
コードに記載されている内容は PR6 時点の情報です。更新されるまでもうしばらくお待ちください。

ご覧のように、「/hello/{name}」リソースのパターンは、_controller 設定値によって参照されるコントローラに対応付けられています。 波括弧で囲まれた文字列 ({name}) は、プレースホルダーであり、コントローラで利用可能な引数を定義しています。

1.3.3. コントローラ

コントローラでは、ユーザのリクエストを処理するアクションを定義し、レスポンス (大体は、HTML 形式) を準備します。

// src/Sensio/HelloBundle/Controller/HelloController.php

namespace Sensio\HelloBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class HelloController extends Controller
{
    public function indexAction($name)
    {
        return $this->render('HelloBundle:Hello:index.html.twig', array('name' => $name));

        // 代わりに PHP テンプレートでレンダーリングする
        // return $this->render('HelloBundle:Hello:index.html.php', array('name' => $name));
    }
}
コードに記載されている内容は PR6 時点の情報です。更新されるまでもうしばらくお待ちください。

このコードは結構簡単ですが、行を追って説明しましょう。

  • line 3: Symfony2 では PHP 5.3 の新機能である名前空間を利用して、すべてのコントローラに、適切に名前空間を割り当てる必要があります。 見てわかるように、名前空間には実際のファイルの場所との相関関係があります。 この例では、ルーティングの _controller 設定値の最初の部分で形成した HelloBundle という名前のバンドルの中にコントローラがあります。
  • line 7: コントローラ名は、ルーティングの _controller 設定値の 2 番目の部分 (Hello) と単語 Controller を組み合わせたものにします。 (このチュートリアルの後半にでてくるように) 便利なショートカットを提供する、組込みの Controller クラスを拡張します。 Controller は、5 行目で定義した Symfony\Bundle\FrameworkBundle\Controller\Controller に属しています。
  • line 9: コントローラはそれぞれ、数個のアクションで構成されます。 ハローページはルーティング設定の通りに、index アクション (ルーティングの _controller 設定値の 3 番目の部分) によって処理されます。 このメソッドは引数に、プレースホルダー設定値 (この場合は $name) を取ります。
  • line 11: render() メソッドは、テンプレートファイル (HelloBundle:Hello:index.html.twig) をロードして、第 2 引数に渡された変数でレンダーリングします。 この例では、テンプレートは、src\Sensio\HelloBundle\Resources\views\Hello\index.html.twig ファイルに相当します。

では、バンドルとは何でしょう? Symfony2 プロジェクトで書くコードはすべて、バンドルで構成されています。 Symfony2 でいうところの、バンドルとは、単一機能 (ブログ、フォーラム、…) が実装されているファイルの集合体 (PHP ファイル、スタイルシート、JavaScript、イメージ、…) であり、他の開発者と簡単に共有することができるもののことです。 この例では、バンドルは 1 つ (HelloBundle) だけあります。

1.3.4. テンプレート

コントローラは HelloBundle:Hello:index.html.twig テンプレートをレンダーリングします。 デフォルトでは、sandbox は Symfony2 のテンプレートエンジンに Twig を用いますが、従来の PHP テンプレートも選択すれば使うことができます:

{# src/Sensio/HelloBundle/Resources/views/Hello/index.html.twig #}
{% extends "HelloBundle::layout.html.twig" %}

{% block content %}
    Hello {{ name }}!
{% endblock %}

おめでとう!ここまで、Symfony2 のコードを用いたページの作成を体験してきました。 そんなに難しくありませんでしたね? まだまだたくさん学ぶことがありますが、Symfony2 によって、実に簡単により良い Web サイトをすばやく実装できることがわかったと思います。

1.4. 作業環境

Symfony2 がどのように動作しているのかについて理解を深めたら、今度はページの一番下をよく見てください。 すると、Symfony2 ロゴと PHP ロゴの入った小さなバーに気づくでしょう。 これは「Web デバッグツールバー (Web Debug Toolbar)」と呼ばれるもので、開発者の強い味方になります。 もちろん、そのようなツールは、本番環境にアプリケーションをデプロイするときには、表示してはいけません。 だから、web/ ディレクトリに本番環境に最適化している別のフロントコントローラ (app.php) があるのです。

http://localhost/sandbox/web/app.php/hello/Fabien

また、mod_rewrite を有効にしてある Apache を使っているなら、URL の app.php 部分を省略することもできます。

http://localhost/sandbox/web/hello/Fabien

大事なことをひとつ言い残しましたが、本番サーバでは、設定をセキュアにするため、Web の root ディレクトリを web/ ディレクトリに合わし、さらに、より見栄えのいい URL にしなければなりません:

http://localhost/hello/Fabien

可能な限り速い本番環境を作るため、Symfony2 は app/cache/ ディレクトリ内にキャッシュを保持します。 コードまたはコンフィギュレーションを変更する場合は、キャッシュされたファイルを手動で削除する必要があります。 アプリケーションを開発する際は、キャッシュを使わない開発用フロントコントローラ (app_dev.php) を使用する必要があります。 開発用フロントコントローラを使えば、変更がすぐに反映されます。

1.5. 最後に

Symfony2 を試してくれてありがとう! 今では、自分で簡単なルーティング、コントローラ、およびテンプレートを作成できるはずです。 練習に、Hello アプリケーションよりも役に立つものを作ってみてください! Symfony2 についてもっと詳しく学びたいのなら、次の章「ビュー」に進んでください。

章番号は翻訳元では削除されましたが、わかりやすくするため振ったままの状態にしています。
翻訳元:
[quick_tour][big_picture] Fixing up some spacing and a few minor changes - 2011-03-08 19:27:38
https://github.com/symfony/symfony-docs/blob/master/quick_tour/the_big_picture.rst
注意: 誤訳が多く含まれている可能性があるため、文章の一部引用はなるべくしないでください。 掲載内容に関しては参考程度にしてください。 誤った情報を拡散しないようにご協力をお願いします。

0 コメント: