symfonyを使ってみよう(2/3)
プロジェクト生成から簡単なアプリケーション作成まで
それでは実際に、簡単なアプリケーションを作成してみることにしましょう。
[1]プロジェクトの生成
これから目指すアプリケーションに必要なファイル群をこのプロジェクトの中で作成していきますが、その前にプロジェクトファイル群を一まとまりにしておくフォルダを作る必要があります。今回はプロジェクト名を「codezine」としましょう。まず、プロジェクトを作成したい場所で(ここでは「C:\Program Files\Apache Software Foundation\Apache2.2\htdocs」とします)「codezine」というフォルダを作成します。
そしてそのフォルダ(C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\codezine)にカレントフォルダを移動し、symfonyコマンドでプロジェクトを作成します。
cd codezine symfony init-project codezine
これで、プロジェクトを始めるにあたってファイルを配置するフォルダ群が生成されました。以下は、init-projectコマンドによって生成されたプロジェクトのスケルトンです。
codezine/(プロジェクトフォルダ) apps/ アプリケーションフォルダ batch/ コマンドラインやスケジューラーから呼び出されるバッチファイル群 cache/ 表示を高速化するためのキャッシュフォルダ config/ プロジェクトの設定ファイル群 data/ データ用フォルダ doc/ ドキュメント用フォルダ lib/ 外部クラス・ライブラリ用フォルダ log/ symfonyによるログファイル群 test/ 単体テスト用フォルダ web/ Webサーバー用ルートフォルダ
[2]プロジェクト内でのアプリケーションの生成
次に、このプロジェクトの中で作成するアプリケーションを宣言します。
symfonyにおいては、一つのプロジェクト内に複数のアプリケーションを作成することができます。実際は個々の用途に応じて「frontend」や「backend」などを名前にすることが多いと思いますが、ここではとりあえず、アプリケーション名を「mycodezine」としましょう。
symfony init-app mycodezine
これでアプリケーション作成のためのフォルダ構造がプロジェクトのアプリケーションフォルダ「apps」の配下にに生成されました。以下が自動生成されたフォルダの構成です。
codezine/ (プロジェクトフォルダ) apps/ mycodezine/ config/ YAMLによる設定ファイル群 i18n/ 国際化用ファイル群 lib/ アプリケーション特有のクラス/ライブラリ用フォルダ modules/ モジュール用フォルダ templates/ アプリケーション、モジュール用テンプレートフォルダ
これまでのコマンドで、「codezine/web/」内に「index.php」ができているはずです。
プロジェクト内の「index.php」は、MVCの「C」を司るフロントコントローラとしての役割を担っています。フロントコントローラはすべてのWebリクエストを受け付け、求められるテンプレートやモジュール・アクションを呼び出しています。また後述する「スマートURL」もフロントコントローラの役割です。symfonyによって自動生成されるこのファイルを変更することは通常ありません。
今度はこの「index.php」に直にアクセスできるように、Apacheの「httpd.conf」ファイルの最後に以下の記述を追記します(もちろん「conf\extra\httpd-vhosts.conf」を参照する設定でそこに追記しても構いません)。
<VirtualHost *:80> ServerName localhost DocumentRoot "C:\Program Files\Apache Software Foundation\Apache2.2\ htdocs\codezine\web" DirectoryIndex index.php Alias /sf "C:\php\PEAR\data\symfony\web\sf" <Directory "C:\Program Files\Apache Software Foundation\Apache2.2 \htdocs\codezine\web"> AllowOverride All </Directory> <Directory "C:\php\PEAR\data\symfony\web\sf"> allow from all </Directory> </VirtualHost>
Apacheのバーチャルホスト機能を使用し、今回作成するプロジェクトサイトのルートディレクトリを「C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\codezine\web」に指定しています。また、symfonyアプリケーションが、デバッグ時(後述)に用いるツールバーの画像ファイルにアクセスできるように、「C:\php\PEAR\data\symfony\web\sf」フォルダにエイリアスを設定しています。さらに、symfonyアプリケーションで「mod_rewrite」モジュールによるスマートURL機能を利用できるように、「codezine/web/.htaccess」ファイルを使用可能にしています。
それでは、
http://localhost/
にアクセスしてみてください。
「coguratulations!」メッセージが表示されていれば、OKです。ここから、実際にアプリケーションに必要なコードを作っていきます。
magic_quotes_gpc = Off
デバッグ機能では各設定変更がキャッシュクリアをしなくても反映され(通常はキャッシュクリアが必要)、またその時の設定よるリクエストや応答の状態も確認できるようになっています(下図)。
さらに、ログ機能ではすべてのイベントが記録され、エラー追跡に必要な情報が得られるよう配慮されています(下図)。
[3]アプリケーション内で動作するモジュールの生成
こちらもsymfonyコマンドで行います。モジュール名は「helloworld」とします。
symfony init-module mycodezine helloworld
これで、「mycodezine」フォルダ内の「module」フォルダに、helloworldモジュール一連のファイルが配置されます。
codezine/ (プロジェクトフォルダ) apps/ mycodezine/ (アプリケーションフォルダ) modules/ helloworld/ (作成されたモジュールフォルダ) actions/ アクション用フォルダ config/ モジュール用設定ファイル lib/ モジュール用クラス・ライブラリ templates/ モジュール用テンプレート validate/ 検証設定ファイル用フォルダ
モジュールフォルダ内にもアプリケーションフォルダ内と同様のフォルダが存在していますが、ここにはモジュールごとの特有の要素が入ります。それ以外は上位(アプリケーション、プロジェクト)の要素が継承されます。このモジュールには、以下のURLでアクセスすることができます。
http://localhost/helloworld
URL末尾がモジュール名になっています。これは後述するスマートURL機能によるものです。ちなみにこの画面の正体は先ほど作成された「helloworld」フォルダ内の「templates/indexSuccess.php」です。これは、MVCの「V」にあたる部分を担っています。このファイルを編集することでデザインの変更が可能です。このファイル名は、実は「<アクション名><実行結果>.php」という命名規則に因んでいます。この場合、「actions.class.php」内に定義されているデフォルトのアクション「index」が無事終了した場合に実行されるビューファイルであることがファイル名から分かります。symfonyはこの命名規則によって必要なビューファイルを判断し呼び出します。