レベル: 中級 Duane O'Brien (d@duaneobrien.com), Java Developer, Freelance
2007年 10月 16日 この「PHP のフレームワーク」シリーズでは、PHP のフレームワークとして広く使われている Zend、symfony、そして CakePHP の 3 つについて取り上げ、それぞれのフレームワークを使ってサンプル・アプリケーションを作成し、拡張しながら、類似点や相違点を検証します。第 1 回はこのシリーズ全体の概要を示し、このシリーズを進めていく上で必要なことを行いました。この第 2 回では、この 3 つのフレームワークそれぞれを使ってサンプル・アプリケーションを作成します。
このシリーズの第 1 回ではこのシリーズ全体の概要を示し、このシリーズを進めていく上で必要なことを行いました。今度は 3 つのフレームワークそれぞれを使ってサンプル・アプリケーションを作成します。今後の記事では、このアプリケーションを拡張し、そのアプリケーションの標準に対する例外を調べ、Ajax に取り組み、外部タスクを統合し、等々を行います。
この記事では、サンプル・アプリケーション Blahg を作成する手順を、3 つのフレームワークそれぞれについて説明します。すべてをゼロの状態から始め、Zend Framework、symfony、そして CakePHP を使って単純なアプリケーションを開発するための基本を学びます。
皆さんは各フレームワークのインストールと前提条件を説明した第 1 回を読み終わっているはずです。もしまだであれば、今すぐ第 1 回を読んでください。
PHP とアプリケーション設計、そしてデータベースの扱い方の知識があることを前提とします。フレームワークの使用経験は必要ありませんが、しっかり取り組む準備ができている必要があります。
Zend Framework で Blahg を作成する
まず、ディレクトリー /column/htdocs/zend と /column/protected/zend を作成します。この 2 つのディレクトリーにはそれぞれ、Web アクセス可能なファイルと、Web アクセスしてはならないアプリケーション・ファイルを置きます。以下の行を含む .htaccess ファイルを /column/htdocs/zend に作成します。
RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
|
各フレームワークにはディレクトリー構造に関する独自の細かな要求があります。Zend Framework の場合には、コントローラー、モデル、そしてビューを保持するためのディレクトリーとして、/column/protected/zend/controllers と /column/protected/zend/models、そして /column/protected/zend/views を作成する必要があります。さらに、ディレクトリー /column/protected/zend/views/scripts を作成する必要があり、また各コントローラーに対して、複数のビューを保持するためのディレクトリーを作成する必要があります。例えば、Blahg には投稿コントローラー用にいくつかのビューが必要になることがわかっているので、このビューを保持するためのディレクトリー /column/protected/zend/views/scripts/post を作成する必要があります。
これでディレクトリーの用意できたので、次はモデルを作成します。
Zend の posts テーブルとモデルを作成する
第 1 回では、これから使用する posts テーブルを作成しました。もしその部分をとばしてしまった場合は、そこに戻って作成してください。このテーブルのためのモデルは非常に単純なはずです。このモデルを Posts.php と呼ぶことにし、これを /column/protected/zend/models/ の中に作成する必要があります。Posts.php はZend_Db_Table クラスを継承し、最も使われるメソッドはこのクラスから継承されたメソッドです。コード・アーカイブで Posts.php ファイルを開くと、実際のコードはほとんどないことがわかります。
Zend のFront コントローラーとPostController を作成する
Front コントローラー用に、index.php ファイルを /column/htdocs/zend の中に作成します。アプリケーションの一部として外部の世界に公開されるのは、このファイルのみです。アプリケーションの他の部分は、このファイルを通してアクセスされます。Front コントローラーは、いくつかのことを行います。つまり、(すべてのライブラリーを手動で含めなくてもすむように) Zend Loader をロードし、データベースへの接続を設定し、そして適切なアプリケーション・コントローラー (この場合にはPostController のみです) にリクエストを送ります。
ご想像の通り、/column/protected/zend/controllers ディレクトリーに、ファイル PostController.php を作成します。作成する必要のある PostController は非常に単純です。
まず、先ほど作成した posts モデルを含める必要があります。そしておそらく、init メソッドを作成する必要があります (このメソッドはPostController オブジェクトが作成されるときに呼び出されます)。init メソッドの中で、今後のアクションで使用するビュー・オブジェクトとモデル・オブジェクトを設定します。皆さんはおそらく、indexAction とreadAction、そしてwriteAction という 3 つのアクションが必要だと推測できるでしょう (アクションに対する xxxxxAction という命名規則は、Zend Frameworkで何かをするときの規則の 1 つです)。
indexAction は単純で、すべての投稿を取得し、それらをビューに割り当てます。readAction もそれほど複雑ではなく、リクエストから投稿 ID を取得し、その投稿を取得し、そしてその投稿をビューに割り当てます。writeAction も決して複雑ではありません。もしリクエストが投稿されていると、すべてのタグを削除し、そのデータをデータベースに保管します。それ以外の場合にはフォームを描画します。
構文と構造の詳細については、コード・アーカイブの中のPostController を調べてください。これでコントローラーが準備できたので、ビューに進むことにします。
Zend の投稿ビューを作成する
もうほとんど完成しています。Blahg にはいくつかのビューが必要です。それらのビューをすべて /column/protected/zend/views/scripts/posts ディレクトリーに作成します。少なくとも 3 つのビュー (index.php と read.php、そして write.php) が必要ですが、コード・アーカイブのコードは 4 つのビューを使っています。ビューは単純なファイルです。index ビューと read ビューは単純に、それぞれに割り当てられたデータを、最小限のフォーマットを適用して出力します。一方 write ビューは、Blahg に投稿する際に使われるフォームを表示します。詳細は「ダウンロード」セクションのコードでビューを調べてください。
モデルとコントローラー、ビューを適切に作成できると (あるいはコードを適切にインストールできると)、Zend Framework バージョンの Blahg をhttp://localhost/zend/post で試すことができるはずです (すべてをローカルにインストールした場合)。
皆さんはおそらく、すぐにでも Blahg をいじりたいかもしれません。しかしまだ夢中になってはいけません。まだ、あと 2 つフレームワークがあるのです。
symfony で Blahg を作成する
symfony で Blahg を作成する方法は少し異なります。まず、symfony のコマンドライン・ユーティリティーを使ってプロジェクトを初期化する必要があります。
symfony のinit コマンドを実行する
ターミナル・ウィンドウに切り替え、コマンドラインを使ってディレクトリー /column/protected/sf_column を作成します。このディレクトリーは、列用の symfony コードすべてを保持する保護ディレクトリーになります。symfony でのコマンドラインの作業は、すべてこのディレクトリーから行う必要があります。ディレクトリーを sf_column に変更し、コマンドphp /column/protected/symfony/data/bin/symfony init-project sf_column を実行します。
このコマンドによって、symfony プロジェクトに必要な大量のディレクトリーとファイルが /column/protected/sf_column に作成されます。次に、Blahg アプリケーションにinit コマンドを実行する必要があります。sf_column ディレクトリーでコマンドphp /column/protected/symfony/data/bin/symfony init-app blahg を実行します。
このコマンドによって、さらにいくつかのディレクトリーとファイルが、主に /column/protected/sf_column/apps に作成されます。しかし、これらの大部分を使う前に、いくつかのファイルを再配置する必要があります。このインストールが外部の世界にほとんどファイルを公開していないことを思い出してください。symfony のinit スクリプトによって作成されたアプリケーション構造は、ディレクトリー構造がどのようになっているのかを認識していません。幸いそれは、下記の行を /column/protected/sf_column/apps/config/config.php の最後に追加すれば変更することができます。
リスト 1. symfony のinit スクリプト用にアプリケーション構造を変更する
$sf_root_dir = sfConfig::get('sf_root_dir');
sfConfig::add(array(
'sf_web_dir_name' => $sf_web_dir_name = 'symfony',
'sf_web_dir' => DIRECTORY_SEPARATOR.'column'.DIRECTORY_SEPARATOR.'htdocs'.
DIRECTORY_SEPARATOR.$sf_web_dir_name,
'sf_upload_dir' => DIRECTORY_SEPARATOR.'column'.DIRECTORY_SEPARATOR.
'htdocs'.DIRECTORY_SEPARATOR.$sf_web_dir_name.DIRECTORY_SEPARATOR.
sfConfig::get('sf_upload_dir_name'), ));
|
要するにこれらの行は、Web ディレクトリーを探す場所を symfony に指示しているのです。
これらの行を追加できたら、/column/protected/sf_column/web の内容を /column/htdocs/symfony に移動する必要があります (もしまだ /column/htdocs/symfony ディレクトリーを作成していなかったら作成します)。そして最後にもう 1 つ重要な点として、/column/htdocs/symfony/index.php を変更し、プロジェクトの真のルート・ディレクトリーがわかるようにする必要があります。SF_ROOT_DIR に対する既存の define を、define('SF_ROOT_DIR', '/column/protected/sf_column'); という行で置き換えます。
もう少しで終わりです。あとは Blahg の投稿モジュールにinit コマンドを実行すればよいだけです。そのためにはコマンドラインで、もう 1 回コマンドphp /column/protected/symfony/data/bin/symfony init-app blahg を実行します。このコマンドは他のコマンドと同じく、いくつかのファイルとディレクトリーを作成しますが、今度は /column/protected/sf_column/apps/blahg/modules/post に作成します。
これで、symfony が動作するようになりました。次は Blahg を設定します。
注意: symfony は、データベースに基づいて CRUD (Create,Read,Update, andDelete) 機能を提供するコードを自動生成する機能を持っています。この機能はアプリケーションの基本部分を手早く準備する上には役立ちますが、ここでこの機能を使ってしまうと、symfony アプリケーションを作成する方法についての感覚をうまくつかめません。そのためこの記事では、アプリケーションを手動で作成します。
モデルを生成する
ここでも、第 1 回で作成した posts テーブルを使用します。
symfony は Propel を使ってオブジェクト・リレーショナル・マッピングを行いますが、モデルの生成は symfony のコマンドライン・ユーティリティーを使って行う必要があります。そのためには、最初にデータベースのスキーマを記述し、データベースに関する情報を提供する必要があります。
※訳注: 上記段落で「スキーマ」と訳してあるところは、原文が scheme となっており、以下多数「スキーマ」と訳してあるところは、すべて原文が schema となっていますが、上記段落も文脈から「スキーマ」と訳した方がよさそうなので、そのように訳してあります。
注意: 厳密には、最初にデータベース情報を提供する必要があるわけではありません。symfony はスキーマに基づいてモデルを作成しますし、スキーマ定義に基づいたデータベースを作成するための SQL スクリプトを、コマンドライン・ユーティリティーを使って生成することすらできるのです。これは今後の記事で取り上げます。
symfony は、データベース・ファイルとスキーマ定義ファイル用に YAML (Yet Another Markup Language) を使います。YAML はそれほど複雑ではありませんが、これまで使ったことがないと理解しにくいかもしれません。この段階では、YAML に関して知っておくとよいのは、空白が重要だということです。
インデントは 2 つの空白を使って作成し、またタブは使いません。
今度は database.yml ファイルと schema.yml ファイルを編集します。これらのファイルは /column/protected/sf_column/config にあります。schema.yml ファイルを編集する必要があるのは、posts テーブルを記述するためです。スキーマ・ファイルを編集し、次の情報を含めます。
リスト 2. schema.yml ファイルを編集する
propel:
posts :
_attributes: { phpName: Post }
id:
title: varchar(255)
text: longvarchar
modified: timestamp
|
注意: おそらくこのコードをコピーしてペーストしたと思いますが、各インデントが 2 つの空白であること、そしてタブが使われていないことをもう一度確認します。例えば、modified の行は前に 4 つの空白があるはずです (posts のインデントに 2 つ、そして modified のインデントに 2 つ)。
database.yml ファイルを編集し、特定のデータベース・パラメーターを含めます。するとリスト 3のようになるはずです。
リスト 3. database.yml ファイル
all:
propel:
class: sfPropelDatabase
param:
phptype: mysql
hostspec: localhost
database: symfony
username: frameworks
password: fwpw
|
これはそれほど難しくないはずです。スキーマとデータベースの構成が完了したので、今度はモデルを生成します。先ほど使用していたコマンドラインに戻り、そして /column/protected/sf_column で次のコマンドを実行します。
php /column/protected/symfony/data/bin/symfony propel-build-model
php /column/protected/symfony/data/bin/symfony clear-cache
|
各コマンドによって大量のデータが出力されますが、最終結果として重要なことは、Post.php ファイルと PostPeer.php ファイルが /column/protected/sf_column/lib/model に作成されていることです。これらのファイルがモデルです。これらのファイルを開いてみると、中身はあまりたいしたことはないということがわかります。これらのファイルは、単にベースのモデル・クラスを継承しているにすぎません。
注意: モデルを再構築する際には、上記のように必ず clear-cache コマンドを実行することが重要です。
これで終わりです。ここで必要なモデルはできあがりました。モデルについて言うべきことは他にもたくさんありますが、コントローラーに移ることにしましょう。
コントローラーを作成する
Zend の場合のように Front コントローラーを作成する必要はありません。symfony には、このコントローラーが既に提供されています。
この投稿コントローラーは実際には actions.class.php と呼ばれ、/column/protected/sf_column/apps/blahg/modules/post/actions にあります。このコントローラーは投稿モジュールに対するすべてのアクションを処理します。これまでと同じく 3 つのアクションが必要ですが、名前は異なり、executeIndex とexecuteRead、そしてexecuteWrite という名前です (executeXxxxxx は symfony がアクションに使用する命名規則であり、この規則に従う必要があります)。
executeIndex アクションは単純で、投稿を取得し、ビューがそれらを利用できるようにします。executeRead アクションも単純です。投稿 ID を取り込み、その ID を基に投稿を取得して、ビューが投稿データを利用できるようにします。executeWrite アクションはリクエストからタイトルとテキストを取り込み、そのデータをデータベースに保管し、保管されていた投稿の ID を返します。
構文と構造の詳細については、「ダウンロード」セクションのコードの post/actions/actions.class.php を見てください。これでコントローラーができたので、今度はビューに移ります。
ビューを作成する
投稿のビューは /column/protected/sf_column/apps/blahg/modules/post/templates にあります。必要なビューは indexSuccess.php と readSuccess.php、そして writeSuccess.php の 3 つです (xxxxSuccess.php という命名規則は symfony の一部であり、この規則に従う必要があります)。
これらのビューは、Zend のビューのように完全な HTML 文書として描画されることはありません。symfony は配置用のデフォルトのテンプレートを (apps/blahg/templates/layout.php に) 提供しており、これが HTML ページの基本的なヘッダーとフッターを提供します。提供する必要があるのは、ビューの中央部分、つまりそのアクション特有のコンテンツです。例えば、indexSuccess.php は単に提供された投稿の配列をループして体裁を整えればよく、readSuccess.php は投稿されたコンテンツの体裁を整え、writeSuccess.php はフォームを表示するか、あるいは、投稿が送信されたときに成功メッセージを出力します。
すべてが適切に作成され、インストールされていれば、symfony バージョンの Blahg をhttp://localhost/symfony/post で試すことができるはずです (すべてをローカルにインストールした場合)。
これで、Zend Framework と symfony で Blahg を作成する方法がわかりました。2 つが終わり、残りは 1 つです。
CakePHP で Blahg を作成する
CakePHP で Blahg を作成する作業を始める前に、いくつかのファイルを移動する必要があります。それからデータベース接続を設定し、後を Cake に引き継ぎます。
※訳注: 原文で Bake となっているところは Cake の誤りとして訳してあります。
ファイル構造を設定する
/column/protected/cakephp/ ディレクトリーを見てください。4 つのディレクトリー、application (アプリケーションを保持するディレクトリー) と cake (Cake のコア・ファイルを含むディレクトリー)、docs (readme 文書)、そして vendors (使用する可能性のあるサードパーティーのライブラリーを置きます) が表示されているはずです。また index.php と .htaccess という 2 つのファイルもあるはずです。この 2 つのファイルは CakePHP を webroot にインストールした場合にのみ使われますが、これは一般的には良いことではありません。Web ブラウザーを使用する誰もがすべてのアプリケーション・ファイルにアクセスできてしまうからです。
好ましいインストール方法は、Web サーバーのルート・ディレクトリーを /column/protected/cakephp/app/webroot にすることです。それと同様に有効な方法 (そしてこのシリーズで好ましい方法) は、/column/protected/cakephp/app/webroot の内容を Web アクセス可能なディレクトリー (この場合は /column/htdocs/cakephp) にコピーする方法です。早速これを実行しましょう。
ファイルをコピーしたら、/column/protected/cakephp/app/webroot/index.php を開き、いくつか編集を行う必要があります。つまりROOT とAPP_DIRに対する既存の定義を更新する必要があります。これはリスト 4 のようになるはずです。
リスト 4.ROOT とAPP_DIR の定義
if (!defined('ROOT')) {
define('ROOT', DS . 'column' . DS . 'protected' . DS . 'cakephp');
}
if (!defined('APP_DIR')) {
define('APP_DIR', 'app');
}
|
とりあえずこれで十分ですが、CAKE_SESSION_STRING の固有値を使ってデータベース情報を入力し、core.php を更新した方がよいでしょう。
column/protected/cakephp/app/config/ で、database.php という、database.php.default のコピーを作り、そしてシステムのホスト名、ログイン名、パスワード、そしてデータベース名を入力します。また /column/protected/cakephp/app/config/core.php でCAKE_SESSION_STRING の define を新しい値を含むように変更します。例えばdefine('CAKE_SESSION_STRING', 'He had a Subbuteo player in his hair. I got distracted.'); のようにします。
これで準備ができました。今度は Cake に取りかかる番です。
注意: CakePHP も symfony と同じように、データベースに基づいて CRUD 機能を提供するコードを自動生成する機能を持っています。また CakePHP には、まったくコードを生成せずに同様のサービスを提供する scaffolding も用意されています。これらの機能はどちらもアプリケーションの基本を手早く準備するためには役立ちますが、先ほども触れたように、ここでこれらの機能を使うと、CakePHP でアプリケーションを作成する方法の感覚をほとんどつかむことができません。
テーブルとモデルを作成する
もし posts テーブルがないようであれば、第 1 回の posts テーブルを作成する部分をとばしてしまっているので、すぐに第 1 回に戻ってposts テーブルを作成してください。/column/protected/cakephp/app/models ディレクトリーに post.php というファイルを作成します。このファイルがモデルのクラス定義を含むことになります。このクラス定義は単純です。クラスはPost であり、AppModel を継承します。そしてクラス変数$name をpost に設定する必要があります。
これだけで終わりです。このモデルはAppModel から継承したすべてのメソッドを使います。今度はコントローラーに移ります。
注意: モデル名は post で単数形ですが、テーブルは posts と複数形で呼ばれることに気付いた人がいるかもしれません。これは Cake の規則の重要な部分です。モデルは必ず単数形であり、モデルに対応するテーブルは必ず複数形なのです。
Cake の投稿コントローラーを作成する
投稿コントローラーは、今回これまでに作成した他のコントローラーと同じく単純なものです。いくつかのヘルパーを取り入れ、3 つのアクション、index とread、そしてwrite を定義します。
index アクションは投稿のリストを取得し、ビューがそれらを利用できるようにします。read アクションは投稿の ID を取得し、その ID を基に投稿を取得して、ビューが投稿データを利用できるようにします。write アクションは (もし送信があれば) 送信を受け付け、そのデータをデータベースに保管します。
構文と構造の詳細については、「ダウンロード」セクションのコードの /column/protected/cakephp/app/controllers/posts_controller.php を見てください。
これでコントローラーができました。今度は最終的なビューに移ります。
Cake のビューを作成する
他のフレームワークで Blahg のために作成したものと同じ、3 つの基本的なビューを作成する必要があります。この場合には、ディレクトリー /column/protected/cakephp/app/views/posts にファイル index.ctp、read.ctp、そして write.ctp を作成します。これらは、symfony の場合に作成したテンプレートとほとんど同じく、CakePHP が使用する単なるテンプレートです。これらのファイルをコード・アーカイブで見てください。このビューはリンクとフォーム要素を出力するためにフォームと HTML のヘルパーを多用しますが、ビューは symfony の場合に作成したビューと似ているはずです。
これらのビューが完全な HTML ファイルを描画しないことに注意してください。デフォルトの配置は CakePHP が提供します。これらのデフォルト配置ファイルは /column/protected/cakephp/cake/libs/views/templates/layouts にありますが、これらを変更してはいけません。デフォルトの配置を変更したい場合には、default.ctp 配置ファイルのコピーを /column/protected/cakephp/app/views/layouts に置き、これを必要に応じて変更します。
注意: Cake でのフォームとリンクは、こうしたヘルパーを使えばずっと管理が容易です。つまり、アプリケーションがインストールされたり別のディレクトリーに移動されたりした場合には、リンクがアプリケーションの適切な場所を指すように Cake が調整を行い、またフォーム要素の名前が適切な形式になっていれば、数々の面倒な仕事を Cake がしてくれるのです。
Blahg の要件に従ってビューを作成するか、あるいは「ダウンロード」セクションのコードからビューをインストールします。すべてが適切に作成され、インストールされていれば、CakePHP バージョンの Blahg を http://localhost/cakephp/posts で試すことができるはずです (ローカルにインストールした場合)。
まとめ
ここでは、非常に多くのことをしました。3 つのフレームワークをインストールし、それぞれを設定して動作させ、そして基本的なアプリケーションを各フレームワークで作成しました。
各フレームワークで Blahg を少し使ってみたら Blahg を拡張してみてください。そして、ユーザーが各投稿に対して独自の返信を投稿できるコメント・コントローラーを作成してみてください。ただし、まだ投稿にコメントをリンクすることに夢中になりすぎないでください。しかし、どうしてもと言うなら、それを試してみましょう。第 3 回では、そのコードを提供する予定です。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| Part 2 sample code | os-php-fwk2.zip | 11KB | HTTP |
|---|
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | |  | Duane O'Brien はゲーム Oregon Trail がテキストのみで構成されていた頃から、万能な技術者として活躍しています。彼の好きな食べ物は寿司です。彼はまだ月に行ったことがありません。 |
記事の評価
|