Symfony2でアプリケーション開発を行う

2011-08-20に文京区シビックホールで行われたLL planetsIPv6ハッカソンに参加し、IPv6を用いたウェブアプリケーションをSymfony2にて開発しました。このエントリはその時の開発を基に起こしたメモです。当日はLAMP環境の構築とウェブアプリケーションの実装を8時間という限られた時間で行ったため、モデル(データベース)を用いたアプリケーションにすることは出来ませんでしたが、Symfony2についておおよその使い方を知っていただくことが出来ると思います。

Symfony2のインストール

以前の「Symfony2をインストールする」を参照してください。

ソースコード管理

開発途中で以前の状態へ戻したり、試験を行っているうちに以前のコードへ戻したくなったりする場面があると思います。そのような場合に備え、小さなアプリケーション開発であってもソースコード管理を行うことが多いと思います。Symfony2はgitで管理されていますので、gitを使って管理するのが良いのではないでしょうか。

gitの場合を例にした具体的な手順はHow to Create and store a Symfony2 Project in gitに書かれています。以下に簡単な手順を記しておきます。

  1. ダウンロードしたアーカイブを解凍する
  2. .gitignoreを作成し、Symfony2関係のディレクトリ等を管理下から除外する
    /web/bundles/
    /app/bootstrap*
    /app/cache/*
    /app/logs/*
    /vendor/
    /app/config/parameters.ini
  3. git init
  4. git add .
  5. git commit
  6. php bin/vendors install

Bundleの作成

Symfony2ではBundleと呼ばれる、symfony 1.xでいうところのpluginのようなまとまりにてアプリケーション開発を行います。このBundleは設定ファイルやコントローラ(symfony のアクションに相当)、テンプレートがまとまった単位で、汎用的なBundleを作ると、Bundle単位で他プロジェクトへそのまま流用が出来ます。これにより、似たようなBundleの再開発を抑えることが出来ます。

具体的な開発手順はCreating Pages in Symfony2に書かれています。

まずはBundleを作ります。Bundleは「ベンダー名/バンドル名Bundle」という形で作成します。ベンダー名は個人の場合、名前や所有しているドメインをつけると良いのではないでしょうか。私はここのドメインである192jpにしようとしましたが、数字から始まるものは使えないそうなので、Javaの名前空間規則に倣い頭にアンダースコアを付けて_192jpとしました。

ちなみに初期状態で用意されているのはAcme/DemoBundleです。ベンダー名である「Acme」はPerl文化で「ごちゃごちゃな」モジュールを置くために用意されている名前空間ですが、Symfony2の解説では「ダミーの名前」として紹介されています

ルーティングの設定

ルーティングファイルはapp/config/routing.yml(特に名前が与えられていませんが、Bundle以下にもrouting.ymlを置けるので、本記事中ではapp/config/routing.ymlを「グローバルルーティングファイル」と区別して呼びます)にありますが、このグローバルルーティングファイルではプレフィックスを指定し、一致したプレフィックスのURLを指定したBundleのルーティングファイルを参照するように記述されています。これにより、前述の他プロジェクトへの流用が容易になります。

例えば、ブログのエントリのように指定した番号のエントリをデータベースから取得し表示するBundleを、ブログメインのサイトではURLプレフィックスを/としてhttp://example.jp/2011/07/30/install-symfony2/と呼び出したり、日記のページとして利用する場合はURLプレフィックスを/diary/としてhttp://example.jp/diary/2011/07/30/install-symfony2/と呼び出したりすることができます。これらの変更は読み込まれているBundle内のルーティングファイルではなく、グローバルルーティングファイルを書き換えるだけになります。

今回、dev環境の場合は個別にプレフィックスを指定しましたが、prod環境の場合はプレフィックスを気にしない(/として)処理するように指定しました。

コントローラの実装

コントローラはリクエストを処理するPHPファイルで、symfony 1.xではアクションに相当します。

symfony 1.xにおいてアクションメソッドのパラメータはWebRequestだけでしたが、Symfony2のアクションメソッドは場面に応じて様々な書きかたが出来るようになっています。例えば、Standard Editionに含まれているデモではルーティングのプレースホルダを使った書きかたになっています。

  • パラメータなし
  • ルーティングのプレースホルダ(名前付きパラメータ)を列挙する
  • Requestオブジェクト

コントローラはResponseオブジェクトを返します。symfony 1.xでは正常応答なのかエラー応答なのかを返していましたが、Symfony2では応答内容とHTTPレスポンスヘッダを組み合わせたオブジェクトを返しています。

コントローラの処理に必要なリクエストパラメータはRequestオブジェクトから参照可能で、通常はフォームオブジェクトを用います。

テンプレートの作成

Symfony2ではTwigテンプレートエンジンがデフォルトで採用されています。今回はTwigを使って実装を行いました。

今までのテンプレートエンジンは、コントローラから指定されたテンプレートが親となりヘッダやフッタを子としてインクルードしていました。一方のTwigではコントローラから呼ばれたテンプレートが親を指定でき(extends ブロックによるテンプレートの継承)、親テンプレートのブロック単位で個々の記述が可能になっています。symfony 1.x時代の資産を生かすことは出来ませんが、新規開発であればTwigを活用したほうが良いと思います。

Twigのキャッシュについて1つ注意が必要です。prod環境(debugモードが無効の場合)ではコンパイルされたTwigテンプレートがキャッシュに存在する場合、Twigテンプレートを書き換えても自動で再コンパイルがされません。app/{environment}/twigにTwigのキャッシュがあるので手動で削除するか、php app/console cache:clear –env=prodする必要があります。

まとめ

Symfony2は思ったより簡単に、そして部品を再利用することに重点の置かれているフレームワークだなと感じました。symfony 1.xで開発を行っている人にとっては多少取っつきにくいところもありますが、徐々にノウハウが溜まってきて良い感じになると思います。

LL planetsはオープンソースカンファレンス2011名古屋と同日のイベントとして行われていました。オープンソースカンファレンスではPHPフレームワークSymfony2の開発チュートリアルが行われており、モデル詳しい解説が読めますので是非参考にしてください。そのためか、LL planetsでSymfony2という言葉を出してもあまり反応が無かったように感じます。

私の作ったSymfony2アプリケーションについては、現段階でソースを公開する予定はありません。


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *