PHP のフレームワーク: 第1回 一般的な 3 つのフレームワーク

Zend と symfony、そして CakePHP

つい数年前までは、PHP に関する一般的な批判の中に、PHP が MVC スタイルのアーキテクチャーをサポートしていないというものがありました。時は変わりました。最近では、PHP のフレームワークにはいくつかの選択肢があります。このシリーズでは、広く使われている 3 つの PHP フレームワークである、Zend、symfony、そして CakePHP を取り上げます。そして、この 3 つの各フレームワークを使ってサンプル・アプリケーションを作成し、また拡張しながら、各フレームワークの類似点と相違点を検証します。

Duane O'Brien, PHP developer, 自由职业者

Duane O'Brien はゲーム Oregon Trail がテキストのみで構成されていた頃から、万能な技術者として活躍しています。彼の好きな食べ物は寿司です。彼はまだ月に行ったことがありません。



2007年 10月 09日

この「PHP のフレームワーク」シリーズは、フレームワークを使いたいと思いながら、現在利用可能なフレームワークの詳細を検討する機会がなかった PHP 開発者のためのものです。このシリーズを最後まで読むと、この 3 つのフレームワークが選ばれた理由と各フレームワークのインストール方法を理解することができ、またこれから 3 つの各フレームワークを使って拡張されるテスト・アプリケーションを自在に扱えるようになるはずです。そう聞くと膨大な作業に思えるかもしれませんが、心配はありません。確かに多くのことを学びますが、必要な情報は理解しやすいブロックに分かれています。

このシリーズについて

第 1 回では、まずこのシリーズ全体の概要を示し、検証対象となるフレームワークを紹介するとともに、そのインストール方法を説明します。さらに、これから作成する最初のテスト・アプリケーションについても説明します。

第 2 回では、3 つの各フレームワークを使ってサンプル・アプリケーションを作成するための手順を、それぞれの類似点と相違点に焦点をあてながら説明します。

第 3 回では、まずテスト・アプリケーションを拡張し、次にフレームワークのルールから外れた場合の処理を扱います。どのフレームワークも、それらのフレームワークが本来目的とする作業を実行する場合は適切に動作します。しかしどのプロジェクトでも、そのフレームワークでは想定されていない作業をしなければならない場合が必ずあります。この記事では、そうした例について説明します。

第 4 回では、Ajax のサポートに主な焦点を当て、ネイティブ・コードとサードパーティーのライブラリーを使って Ajax を利用する方法を検証します。具体的には、各フレームワークがどう振る舞い、よく使われる特定のライブラリーをどう扱うかを検証します。

第 5 回では、フレームワークの外部での作業について説明します。1 つのタスク (毎晩更新されるスクリプト) を考え、このタスクを完了するためのプロセスを各フレームワークについて検証します。


この記事について

この記事は内容が盛り沢山なので、頑張ってついてきてください。検証する対象のフレームワークは 3 つあります。どの 3 つなのでしょう。なぜこの 3 つなのでしょう。他にどんなフレームワークがあるのでしょう。なぜ他のフレームワークは取り上げないのでしょう。質問は山ほどあります。そうしたほとんどの質問に対する答えは、各フレームワークのインストール・プロセスを説明するまでには、得ることができます。その後で、このシリーズの第 2 回以降に使用するテスト・アプリケーションについて学びます。この記事を読み進めるとすぐに、さまざまなフレームワークがどのように異なり、どのような点が同じなのかがわかるはずです。

システム要件

始める前に、作業をするための環境が必要です。要件は、ごく最小限のものです。

  1. セッションを (できれば mod_rewrite も) サポートする HTTP サーバー: このシリーズは mod_rewrite を有効にした Apache V1.3 を使って作成されています。
  2. PHP V5.1.4 またはそれ以降: 検証されるすべてのフレームワークがこのリリース・レベルの PHP を必要とするわけではありませんが、簡単のために、すべてのフレームワークで同じ PHP のインストールを使います。このシリーズは PHP V5.2.3 を使って作成されています。
  3. 比較的最近リリースされた MySQLのインストール: 他のデータベースもサポートしており、使用することも可能ですが、このシリーズとそのサンプル・アプリケーションでは MySQL V5.0.37 を使って作成されています。
  4. PHP V5.2.4 以降と MySQL をサポートするオペレーティング・システム: このシリーズでは Linux® を使っています。Windows® ユーザーの場合、特に以降の説明でディレクトリーを作成する際には、Windows 環境に合わせた読み替えをする必要があります。

前提条件

PHP とアプリケーション設計、そしてデータベースの扱い方の知識があることを前提とします。フレームワークの使用経験は必要ありませんが、しっかり取り組む準備ができている必要があります。


フレームワークとは

どのフレームワークが選ばれたのかを説明する前に、フレームワークとは何かを説明した方がよいでしょう。

フレームワークの背景にある考え方は、複数のアプリケーションにまたがって使用できる設計を提供する、というものです。すべてのアプリケーションには、共通となる基本部分が沢山あります。具体的には、データベースとのインターフェースや、アプリケーション・ロジック、アプリケーションをユーザーに表示するための仕組み、などです。皆さんに PHP アプリケーションを作成した経験が豊富にあれば、この基本部分がどのようなものかはわかるはずです。皆さんはおそらく、データベースに対してデータを読み書きする一連の関数やクラスを作成したことがあるでしょう。あるいは、Smarty のようなテンプレート・エンジンを使って UI を管理したことがあるかもしれません。少なくとも、フォーム送信を分析し、送信されたデータに基づいて判断を下す、というような処理を行う一連の PHP コードを作成したことがあるはずです。数々のアプリケーションを作成してきた人なら、これと同様の基本的な処理を行う PHP コードを繰り返し何度も作成したことがあるでしょう。時にはあるアプリケーションのコードを別のアプリケーションに使ったこともあるかもしれません。

フレームワークは、こうした共通要素 (データベースとのやり取り、表示レイヤー、アプリケーション・ロジックなど) のための構造を提供するように設計されています。そのため、データベースとのインターフェース・コードや表示レイヤーのインターフェースを作成するための時間を削減でき、より多くの時間をアプリケーションそのものの作成に費やすことができます。このようにアプリケーションを分解することで表現されるアーキテクチャーは、MVC (Model-View-Controller) と呼ばれます。モデル (Model) はデータを表し、ビュー (View) は表示レイヤーを、そしてコントローラー (Controller) はアプリケーションまたはビジネスのロジックを表します。この記事では MVC の完全な説明は省略しますが、皆さんも MVC について調べ、なぜそんなに MVC と言われるのかを学んでみるようにお勧めします。


フレームワークを選択する

ほとんどすべての言語では、いくつかのフレームワークを利用することができます。自分が必要とするものに合った適切なフレームワークを選択することは、特に今までどのフレームワークも使ったことがない場合には、少し難しいものです。こういった点では、同僚からの、そして信頼できる developerWorks の著者達からの助言や意見は役に立ちますが、どのようなフレームワークを選択する場合にも従うべき指針となる原則は 1 つしかありません。それは、フレームワークの価値は、そのフレーワークを使うことによって削減できる全員の時間および作業の総量と等しいということです。ある人にとって便利でも、サポートのための問い合わせが大幅に増えてしまうなら、そのフレームワークを採用する価値はありません。サポートが容易でも、開発の補助どころかむしろ開発を妨げるようであれば、その場合もフレームワークを採用する価値はありません。フレームワークが素晴らしくても、サポートや開発に問題を引き起こすようであれば、そのフレームワークは役に立たないということです。

プロジェクト用のフレームワークを選択する場合には、そのプロジェクトに関係するトップの人から末端の人まで全員を考慮する必要があり、またフレームワークを評価する場合には、他の関係者への影響を念頭に置く必要があります。

フレームワークの採用を考える場合には、アプリケーションを詳細に調べ、そのアプリケーションにフレームワークが必要かどうかを自問してみます。フレームワークは必ずしも必要なものではありません。エンタープライズ・アプリケーションは、今後もフレームワークを使わずに作成され続けるでしょう。そのプロジェクトにとって、フレームワークは役に立つのでしょうか。全員の時間と作業を削減できるのでしょうか。フレームワークを使った方がアプリケーションのパフォーマンスは向上するのでしょうか。不足している安定性を提供できるのでしょうか。こうした質問のどれかに対して答えが「イエス」なら、フレームワークの採用を検討する必要があります。こうした質問すべてに対して答えが「ノー」なら、フレームワークは、ことを複雑にするだけです。

残念なことに、この記事のスペースと説明範囲の制約から、入手可能なすべての PHP 用フレームワークを完全に網羅することはできません。このシリーズでは、次の 3 つのフレームワークに焦点を絞ります。

  • Zend Framework
  • symfony
  • CakePHP

これらはさまざまな要因を考慮して選んだものですが、次のように言えば適確かもしれません。つまり「皆さんの上司が知っているもの」、「誰か他の人が既にインストールしたもの」、そして「皆の噂になっているもの」という分類で選んだものです。この他にも、CodeIgniter やSeagull、Web Application Component Toolkit (WACT)、PRADO、Zoop、PHP on Trax など、入手可能な PHP のフレームワークは数多くあるので、これらについても調べてみるようにお勧めします。フレームワークの選択は非常に個人的な選択であり、コーディング用の言語の選択と似ています。このシリーズでは、フレームワーク同士を比較して良し悪しを論じることはしていません。あるフレームワークによって何かを適切に処理できる場合には、その点を指摘します。あるフレームワークが扱いにくいと思われる場合にも、その点を指摘します。ここでは無数にあるフレームワークを完全に網羅した説明はできませんが、ここで説明することは、ここで示すもの以外のフレームワークの強みや弱みを比較する際にも役に立つはずです。皆さん自身が、自分がどのフレームワークを好むのか、そしてどのフレームワークを追求するのか、検証対象のフレームワークについて自分の意見を持つ必要があります。

Zend Framework

Zend は誰もが知っている「PHP の会社」です。PHP をダウンロードしてインストールする際には Zend からダウンロードするのであり、この状況は V3 あたりから変わっていません。Zend Technologies は PHP を配布する他に、PHP をサポートする広範な種類の技術を長年提供してきています。Zend が PHP 用のフレームワークを提供していることは驚くにあたらないはずです。Zend のフレームワークはよく利用されており、現在までに 2 百万回ダウンロードされています。皆さんの上司が PHP のフレームワークについて聞いたことがあるとしたら、それはおそらく Zend Framework です。

symfony

Sensio がスポンサーである symfony は、「Web アプリケーションの作成と保守を迅速に行い、反復的なコーディング作業を、強力でコントロール可能な楽しい作業に置き換えることを目的としています。」 symfony フレームワークは、世界中の数々のエンタープライズ・レベルのアプリケーションで使われており、その中でおそらく最も有名なものは Askeet と Yahoo! Bookmarks でしょう。皆さんの知り合いの誰かが PHP のフレームワークをインストールしたり使用したり、あるいは少しいじってみたことがあるとしたら、そのフレームワークはおそらく symfony です。

CakePHP

CakePHP は Ruby on Rails から多くを借用することで、PHP のフレームワークに単純さとスケーラビリティーをもたらそうとしています。CakePHP が最高の PHP フレームワークであるという評価は一貫しており、最近では Mambo Content Management System の V5 のコアとして選択されました。強力なコミュニティーと急速に成長しつつあるユーザー・ベースのおかげで、CakePHP の人気も着実に上がっています。皆さんが PHP のフレームワークに関する会話を漏れ聞いたことがあるとしたら、それはおそらく CakePHP についての会話だったのです。


インストール

それぞれのフレームワークには独自のインストール手順があり、この記事ではインストールの詳細に関する完全な説明は省略します。このセクションではそれぞれのインストールについて取り上げ、個々のフレームワークのインストール手順では説明されていない可能性のある重要な点や、あるいは 3 つのフレームワークすべてを 1 台のマシンにインストールするために必要となる、標準の手順から外れた項目について説明します。

まず、フォルダー (例えば /column というディレクトリー) を作成します。このフォルダーには、このシリーズで必要となるすべてのコードとフレームワーク、そしてインクルードが置かれます。このディレクトリーに、さらに 4 つのディレクトリー (htdocs と protected、include、そして src) を作成します。Apache の構成ファイルを編集して文書ルートが /column/htdocs を指すようにし、そしてついでに、mod_rewrite を (まだ有効にしていなかったら) 有効にします。php.ini 構成ファイルを編集して include_path ディレクティブに /column/include/ ディレクトリーを含めます。こうすることの意味がまだわからなくても、心配することはありません。いくつもフレームワークをインストールしているうちに、すべてが明確になります。

Zend Framework をインストールする

Zend Framework をダウンロードします (「参考文献」を参照)。このシリーズでは V1.0.1 を使っています。Zend Framework をダウンロードし、/column/src ディレクトリーに解凍します。このディストリビューションには、いくつかのテキスト・ファイルと 3 つのディレクトリー (demos と tests、そして library) が含まれています。library ディレクトリーの内容を (これは Zend という単なるフォルダーのはずです) /column/include/ ディレクトリーにコピーします。これで、多数のディレクトリーとファイルを含む /column/include/Zend というフォルダーができているはずです。これらは Zend Framework が使用するライブラリーです。

これで終わりです。これで Zend Framework をインストールできました。

symfony をインストールする

symfony をダウンロードします (「参考文献」を参照)。symfony はダウンロード・ページにリストされたどの方法でもインストールできますが、ここでは tarball をダウンロードするようにお勧めします。tarball を /column/src/symfony/ ディレクトリーに解凍します。そうすると、4 つのディレクトリー (data と doc、lib、そして licenses) と、いくつかの README 文書ができるはずです。これらのすべてが最終的なアプリケーションのインストールに必要なわけではありませんが、今はこのままで構いません。これはインストールとしては単純すぎるように思えるかもしれません。しかしこれらのフレームワークは一般的にユーティリティーとライブラリーから構成されているので、インストールは難しくない、ということを覚えておいてください。ただしフレームワークを使う場合には、もう少し構成が必要です。これは後で明らかになります。

CakePHP をインストールする

CakePHP をダウンロードします (「参考文献」を参照)。この記事のシリーズでは 1.2.0.5427 アルファ・バージョンを使っています。CakePHP のバージョン 1.2 シリーズは、成熟しているといってもアルファなのですが、CakePHP のコミュニティーでは標準的なものとして広く採用されています。tarball をダウンロードして解凍し、その内容を /column/src/cakephp に置きます。すると 4 つのディレクトリー (app、cake、doc、そして vendors) と 2 つのファイル (.htaccess と index.php) ができるはずです。後でこれらのファイルのいくつかを移動しますが、今はこのままで構いません。


テスト・アプリケーション

ここまでで、3 つのフレームワークをダウンロードし、インストールしました。しかし気が付いていると思いますが、実際には、まだこれらを使って、例えば Hello World アプリケーションを使ってインストールを検証するなど、何かをしたわけではありません。その理由は、これから Hello World を飛び越え、もう少し中身のある (でも大がかりではない) ことをしようとしているからです。

PHP フレームワークを使って Hello World アプリケーションを作成しようとすると、少しばかり苦痛を伴います。フレームワークを使うことで少しオーバーヘッドが生じ、Hello World のような単純なことをしようとすると、そのオーバーヘッドが障害になります。しかしその同じオーバーヘッドも、もっと複雑なアプリケーションを処理する際には適切な対価に思えるはずです。

これから作成するテスト・アプリケーションは、(まだ) 大したものではありません。このアプリケーションでは、テキスト領域を使ってアプリケーションにテキストを投稿することができます。このテキストはデータベースに保管され、リクエストに従ってアプリケーションが取得し、表示します。こうしたアプリケーションを使うことで、HTML の編集や新しいファイルのアップロードをしなくても、Web サイトのコンテンツの作成や更新を容易に行うことができます。この、非常に革新的で画期的なアプリケーションは Blahg と呼ばれます。

では、Blahg とはどんなものなのでしょう。

Blahg についての説明から、このアプリケーションをどう設計するかについて、いくつかのことを推論できるはずです。Blahg には次の 4 つの要素が必要です。

  1. フォームを含むページ: このフォームは少なくともテキスト領域を含む必要があります。このページは書き込み用のページです。
  2. 投稿を読み取るページ: このページには何らかの投稿の ID を渡す必要があります。このページは読み取り用のページです。
  3. すべての投稿をリストするページ: このページは索引ページです。
  4. 投稿を保持するデータベース・テーブル: このテーブルは、少なくとも投稿のテキスト、ID、そしておそらくタイトルと最終更新日を保持する必要があります。

当然ですが、Blahg をもっと本格的なものにすることもでき、実際このシリーズの今後の記事では、いくつか機能強化を行います。しかし今のところは、こうした単純な要求で十分です。残念ですが、まだ今回はフレームワークを使って Blahg を作成する作業は行いません。それは第 2 回に行います。ただし、これから使用するデータベースを設定するのは、今が適切です。


データベースを設定する

実際に Blahg の作成を始める前に、データベースを設定する必要があります。個々のフレームワークそれぞれに対してデータベースを設定する必要はまったくありませんが、このシリーズでは、それぞれに対してデータベースを設定した方がわかりやすくなり、またテーブル接頭辞も必要なくなります。

Zend、symfony、そして Cake という 3 つのデータベースを作成し、各データベースへの完全な権限を適切なユーザーに許可します。各フレームワークに対する下記の説明の中では、posts テーブルを作成するために必要な SQL についても触れます。

データベースを設定する際に、Blahg が最初に使用するテーブルも作成します。下記の SQL を使って Zend のデータベースと symfony のデータベースに posts テーブルを作成します。

リスト 1. Zend と symfony に posts テーブルを作成する
CREATE TABLE 'posts' ( 
'id' INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , 
'title' VARCHAR( 255 ) NOT NULL , 
'text' TEXT NOT NULL , 
'modified' TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
) ENGINE = MYISAM ;

Zend と symfony の場合には、変更される列の管理をデータベースに任せます。CakePHP の場合には、ほんの少し異なる SQL を使います。そうすることで、Cake が少しばかり魔術を行ってくれるのです (具体的には、変更される列を CakePHP が自動的に管理します)。

リスト 2. CakePHP に posts テーブルを作成する
CREATE TABLE 'posts' ( 
'id' INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , 
'title' VARCHAR( 255 ) NOT NULL , 
'text' TEXT NOT NULL , 
'modified' DATETIME DEFAULT NULL 
) ENGINE = MYISAM ;

これはテーブルの構文として、これ以上ないほど簡単なものです。これらのテーブルを見ると、Blahg がどんなものであり、どのように動作するかのイメージが明確にわかるはずです。場合によっては、皆さん自身で Blahg を作成してみるのもよいかもしれません。


今後のステップ

今すぐフレームワークを使い始め、いじってみたいという誘惑を我慢してください。それよりも少し時間をかけ、フレームワークを使わずに Blahg を作成してみてください。どんな方法でも構わないので、皆さんがいつもアプリケーションを作成する際に慣れている方法で作成してみてください。ただし Blahg を作成する際には上記の要件を守り、あまり手の込んだものにしないでください。フレームワークを使わずにテスト・アプリケーションを作成し、このシリーズを通して強化していく機能を含めるようにそのアプリケーションを変更することで、そのフレームワークが皆さんの必要にどの程度合ったものか、また皆さんの開発スタイルにどの程度合っているかを適切に判断することができます。


まとめ

今回は基本的なことを説明しました。インストールはスムーズに進んだと思いますが、もし何らかの問題に突き当たった場合には、それぞれのフレームワークの、インストールに関するドキュメンテーション (「参考文献」を参照) を注意深く読む必要があります。少し時間をかけ、上記の説明に従って Blahg を作成してみてください。その時間は有益なもののはずです。

参考文献

学ぶために

  • PHP のフレームワーク」シリーズのほかの記事も読んでください。
  • Zend Framework のマニュアルを見てください。
  • symfony のドキュメンテーションを入手してください。
  • CakePHP のマニュアルを調べてみてください (注意: このマニュアルは CakePHP V1.1 用に書かれています。ここでは CakePHP V1.2 を使うので、少し異なる部分があるかもしれません)。
  • 5 回シリーズの「Cook up Web sites fast with CakePHP」を読んでください。
  • Wikipedia を訪れ、ソフトウェア・フレームワークを概観してください。
  • Wikipedia で MVC アーキテクチャーの概要を調べてください。
  • PHP マニュアルで詳細情報を参照してください。
  • PHP.net には他にも PHP のドキュメンテーションが用意されています。
  • PHP でのプログラム方法を学ぶためのチュートリアルとして、developerWorks の「PHP.net」シリーズをご利用ください。
  • PHP.net は PHP 開発者のための中心的なリソースです。
  • Recommended PHP reading list」を調べてみてください。
  • developerWorks には他にも PHP に関する資料が豊富に用意されています。
  • IBM developerWorks の PHP project resources を利用して PHP のスキルを磨いてください。
  • developerWorks podcasts では、ソフトウェア開発者のための興味深いインタビューや議論を聞くことができます。
  • PHP でデータベースを使うのであれば、Zend Core for IBM を調べてみてください。これはシームレスでそのまま使用でき、インストールも容易な、IBM DB2 9 をサポートする PHP の開発環境であり実動環境です。
  • developerWorks の Technical events and webcasts で最新情報を入手してください。
  • IBM オープンソース開発者にとって関心のある、世界中で今後開催される会議や業界展示会、ウェブキャスト、その他のイベントについて調べてみてください。
  • developerWorks の Open source ゾーンをご覧ください。オープンソース技術を使った開発や、IBM 製品でオープンソース技術を使用するためのハウ・ツー情報やツール、プロジェクトの更新情報など、豊富な情報が用意されています。
  • IBM とオープンソース技術、そして製品機能を調べ、学ぶために、無料の developerWorks On demand demos をご覧ください。

製品や技術を入手するために

  • PHP V5.2.3 をダウンロードしてください。
  • symfony をダウンロードしてください。
  • CakePHP をダウンロードしてください。
  • 皆さんの次期オープンソース開発プロジェクトを IBM trial software を使って革新してください。ダウンロード、あるいは DVD で入手することができます。
  • IBM 製品の評価版をダウンロードし、DB2® や Lotus®、Rational®、Tivoli®、WebSphere® などのアプリケーション開発ツールやミドルウェア製品を試してみてください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=267247
ArticleTitle=PHP のフレームワーク: 第1回 一般的な 3 つのフレームワーク
publish-date=10092007