第1章 - symfony の紹介
symfony を使うとどういったことができるのでしょうか。symfony を使うのに必要な準備はどういったものでしょうか。この章ではこれらの内容を説明します。
symfony とは
フレームワークは特定の目的のために採用される多くのパターンを自動化することでアプリケーション開発の合理化を推し進めます。またフレームワークはコードに構造を加えることで開発者に読みやすく維持しやすいコードを書くよう奨励します。フレームワークは複雑な作業を簡単なステートメントにまとめるので、最終的に、プログラミング作業はより楽になります。
symfony は、Web アプリケーションの開発を最適化するためにいくつかの重要な特徴を通して設計された完全なフレームワークです。初心者のために、symfony は Web アプリケーションのビジネスルール、サーバーのロジック、そしてプレゼンテーションのビューを分離します。symfony は複雑な Web アプリケーションの開発期間を短くすることを目的とした多くのツールとクラスを搭載しています。加えて、開発者がアプリケーションだけに集中できるように symfony は共通のタスクを自動化します。これらの利点の最終結果は新しいアプリケーションを作るたびに車輪を再発明する (reinvent the wheel) 必要がないことを意味します!
symfony は完全な PHP で書かれました。symfony は現実の世界のさまざまなプロジェクト(answers、delicious、dailymotion)で徹底的にテストされ、高度な要件が求められる電子商取引のWebサイトでも実際に利用されています。symfony は MySQL、PostgreSQL、Oracle、Microsoft SQL Server を含む利用可能なほとんどのデータベースエンジンと互換性があります。symfony は Unix 系や Windows プラットフォームで動作します。つぎのセクションで機能を詳しく見ることにします。
symfony の機能
symfony はつぎの要件を満たすために開発されました:
- 多くのプラットフォームでのインストールと設定作業が簡単である (そして標準的な Unix 系と Windows プラットフォームでの動作が保証されている)
- データベースエンジンに依存していない
- 多くの案件で使いやすい一方で、複雑な案件に適合する柔軟性がある
- 設定よりも規約 (convention over configuration) の前提に基づく -- 開発者は型にはまらないものだけ設定する必要がある
- 主要な Web 開発のベストプラクティスとデザインパターンに準拠する
- 企業の既存の情報技術 (IT) の方針とアーキテクチャに適合する用意ができていて、長期間のプロジェクトにおいて十分に安定している
- 維持しやすく、phpDocumentor コメントを含む、とても読みやすいコード
- 拡張するのが簡単で、ほかのベンダーライブラリとの統合が可能である
自動化された Web プロジェクト機能
Web プロジェクトの大部分の共通機能は、つぎのように symfony の範囲内で自動化されます:
- 内容のローカライゼーション (現地化) と同様に、組み込みの国際化レイヤーによってデータとインターフェイスの両方の翻訳を可能にする。
- プレゼンテーションは symfony の知識を持たない HTML デザイナーによって開発できるテンプレートとレイアウトを利用する。大部分のコードを単純なコードの呼び出しにカプセル化することでヘルパーは書く必要のあるプレゼンテーションのコード量を減らす。
- フォームは自動化されたバリデーション (検証) と再投入をサポートする。このことによって質のよいデータベースのデータと優れたユーザーエクスペリエンスが保証される。
- 出力エスケーピングによって不正なデータ経由の攻撃からアプリケーションを保護する。
- キャッシュの管理機能は回線の帯域幅の使用量とサーバーの読み込み回数を減らす。
- 認証とクレデンシャル機能は制限つきのセクションとユーザーのセキュリティ管理機能の作成を円滑にする。
- ルーティング (routing) とスマート URL (smart URL) はページのアドレスをインターフェイスの一部にして検索エンジンにフレンドリーにする。
- 組み込みのEメールと API の管理機能はWebアプリケーションが古典的なブラウザーのインタラクションを越えることを可能にする
- 自動ページ分割 (パジネーション - pagination)、ソート、そしてフィルタリングのおかげでリストはよりユーザーフレンドリーになる。
- ファクトリ、プラグイン、そしてイベントシステムは高いレベルの拡張性を提供する。
開発環境とツール
独自のコーディングのガイドラインとプロジェクトの管理ルールを持つ企業の要件を満たすために、symfony を完全にカスタマイズできます。symfony には標準でいくつかの開発環境が組み込まれており、次のような、一般的なソフトウェアエンジニアリングのタスクを自動化する複数のツールがあります:
- コード生成ツールはプロトタイプ作成とワンクリックで実行できるバックエンドの管理画面のために大いに役立つ。
- 組み込みのユニットテスト (単体テスト) と機能テスト (ファンクショナルテスト) のフレームワークはテスト駆動開発を可能にする完璧なツールを提供する。
- デバッグパネルは開発者がとり組んでいるページで必要なすべての情報を表示するのでデバッグ作業を迅速に行うことができる。
- コマンドラインインターフェイス (CLI) は2つのサーバー間のアプリケーションのデプロイを自動化する。
- 稼働中のアプリケーションの設定を効率よく変更できる
- ロギング機能はサイト管理者にアプリケーションの活動に関する完全な詳細内容を提供する。
symfony をつくったのは誰?なぜ?
プロジェクトの創設者であり、この本の共著者でもある Fabien Potencier (ファビアン・プゥトンシェ) によってsymfonyの最初のバージョンは2005年10月に公開されました(訳注:そのほかの開発メンバーの名前の読みかたは「Sensio(symfony)訪問レポート」を参照)。Fabien は Sensio (http://www.sensio.com/) の CEO です。Sensio はフランスのWeb制作会社でWeb開発に関して革新的な見解を持つことでよく知られています。
2003年の頃に、Fabien は Web アプリケーションのために PHP 製の既存のオープンソース開発ツールの調査に時間を費やしましたが、まえに説明した要件を満たすものが存在しないことが判明しました。PHP 5 が公開されたとき、彼は利用できるツールをフルスタックフレームワークに統合するのに十分に成熟した段階に到達したと判断しました。その後彼は symfony コアの開発に1年費やしました。symfony コアはモデル・ビュー・コントローラー (MVC) フレームワークである Mojavi、オブジェクトリレーショナルマッピング (ORM) である Propel、そして Ruby on Rails のテンプレートヘルパーなどがベースとなっています。
Fabien は Sensio のプロジェクトのために symfony を開発しました。思いどおりに使える効率的なフレームワークを保有することはアプリケーションを早く効率的に開発する理想的な方法を示すからです。これによって Web 開発がより直感的なものになり、アプリケーションは堅牢で維持が楽になりました。ランジェリー小売店用の電子商取引の Web サイトを開発するために symfony を採用したときにその性能は確かめられました。そしてその後、ほかのプロジェクトにも適用されました。
symfony を利用していくつかのプロジェクトを成功させた後に、Fabien は symfony をオープンソースのライセンスのもとで公開しました。公開したのは、作品をコミュニティに寄贈するため、ユーザーのフィードバックの恩恵を受けるため、Sensio の経験を展示するため、そして面白いからです。
NOTE 「symfony」が「FooBarFramework」ではないのはなぜでしょうか?覚えやすくほかの開発ツールを連想しないようにするために、Fabien は Sensio を表すsとフレームワークを表す f を含む省略語が欲しかったからです。また、彼は大文字も好みませんでした。symfony は完全な英語ではないとしても十分に英語に近い名前であり、プロジェクトの名前としても利用可能でした。ほかの代替案は「baguette (フランスパン)」でした。
symfony の採用率を上げてオープンソースプロジェクトとして成功するために、大規模な英語のドキュメントが必要でした。Fabien は仲間の Sensio 従業員で、この本のもうひとりの著者である Francois Zaninotto (フランソワ・ザニノット) にコードを徹底的に研究してオンラインの教科書を書くように依頼しました。プロジェクトが公開されてからしばらくかかりましたが、大勢の開発者にアピールするのに十分なドキュメントが作られました。その後の話はご存じのとおりです。
symfony のコミュニティ
symfony の公式サイト (http://www.symfony-project.org/) が公開されるとすぐに、世界中から大勢の開発者がフレームワークをダウンロートしてインストールし、オンラインのドキュメントを読み、symfonyで最初のアプリケーションを構築し、興奮のざわめきが始まりました。
当時、Web アプリケーションのフレームワークの人気が出つつあり、PHP 製のフルスタックフレームワークは高い需要がありました。symfony は、すばらしい品質のコードと特筆すべき量のドキュメント、フレームワークのカテゴリにおいてほかのプレイヤーを越える2つの長所、のおかげで説得力のあるソリューションを提案しました。貢献者がすぐに名乗り出て、パッチと機能の強化を提案し、ドキュメントの校正を行い、そのほかの必要とされた役割を果たしました。
公開ソースリポジトリ (svn) とチケットシステム (trac) は貢献するためのさまざまな方法を提供し、ボランティアはみな歓迎されます。Fabien は今もなおソースコードリポジトリの trunk の主要なコミッターで、コードの品質を保証します。
今日において、symfony のフォーラム、メーリングリスト(ユーザー向け、開発者向け)、IRC のチャンネルはざっと見て1つの質問に対して平均4つの回答を得られる理想的なサポート施設を提供します。毎日新人が symfony をインストールし、ウィキとコードスニペットのセクションでは多くのユーザーが投稿したドキュメントがホストされています。現在では、symfony は最も人気のある PHP のフレームワークの 1 つになっています。
symfony のコミュニティはこのフレームワークの3番目の強みで、あなたもこの本を読んだ後に参加してくださることを我たち執筆者は望んでいます。
symfony は私の用途に合っていますか?
あなたが PHP の専門家であっても、Web アプリケーションのプログラミングの新人であっても symfony を使えるようになります。symfony で開発をするかどうか決める主な要因はあなたのプロジェクトの規模です。
データベースへのアクセスが制限されており、5ページから10ページ程度の簡単な Web サイトを開発したい場合で、パフォーマンスを保証するもしくはドキュメントを提供する義務がなければ無地のPHPコードにこだわるべきでしょう。Webアプリケーションのフレームワークから多くのことを得られず、おそらくはオブジェクト指向もしくはMVCモデルが開発プロセスを遅らせることになるでしょう。追記として、symfony は PHP スクリプトが CGI (コモンゲートウェイインターフェイス) の共用サーバー上で効率的に動作するように最適化されていません。
一方で、重いビジネスロジックをかかえる、より複雑な Web アプリケーションを開発する場合、無地の PHP では十分ではありません。将来アプリケーションを維持するもしくは拡張することを計画する場合、コードを軽量に、読みやすく、効果的なものにすることが必要になります。直感的な方法で (Ajax のような) ユーザーインタラクションの最新機能を使いたい場合、JavaScript を数百行書くだけではすまされません。早く楽しく開発したい場合、無地の PHP だけではおそらく失望するでしょう。これらすべてのケースにおいて、symfony はあなたを支援します。
そして、もちろん、あなたがプロの Web 開発者であるなら、すでに Web アプリケーションのすべての利点を理解しており、成熟し、充実したドキュメントがあり、大きなコミュニティを持つフレームワークが必要です。もう検索しなくても、symfony があなたのソリューションです。
TIP 視覚的なデモンストレーションがお好みなら、symfony の Web サイトからスクリーンキャストをご覧ください。symfony でアプリケーションを開発することがどんなに速くて楽しいことなのかわかるでしょう。
基本概念
symfony で始めるまえに、基本概念を学んでおきます。すでに OOP、ORM、RAD、DRY、KISS、TDD、YAML の意味をご存じでしたら、読み飛ばしてください。
PHP
symfony は PHP (http://www.php.net) で開発され、同言語で Web アプリケーションを開発することを専門としてしています。そのため、フレームワークを最大限活用するには PHP とオブジェクト指向プログラミングをしっかりと理解していることが必要です。symfony を動かすために必要な PHP の最小バージョンは 5.2.4 です。
OOP
オブジェクト指向プログラミング (OOP - Object-Oriented Programming) はこの章では説明しません。1冊の本が必要だからです! symfony は PHP 5 で利用できるオブジェクト指向のメカニズムを広範囲で活用しているので、OOP は symfony を学ぶための必須条件です。
Wikipedia において OOP はつぎのように説明されています:
"オブジェクト指向プログラミングの背景にある考えかたは、プログラムを関数の集まりもしくはコンピュータへの単なる命令の一覧とみなす伝統的な見かたとは対照的に、コンピュータプログラムはお互いに影響を与える個別のユニット、もしくはオブジェクトの集まりをコンフィギュレーションするものとしてみなすことです。"
PHP はクラス、オブジェクト、メソッド、継承やそのほかのオブジェクト指向のパラダイムを実装します。これらの概念になじみがない方はhttp://www.php.net/manual/language.oop5.basic.phpなどの関連ドキュメントを読むことをお勧めします。
マジックメソッド
PHP のオブジェクト機能の強みの1つはマジックメソッド (magic method) が使えることです。これらのメソッドは外部コードを修正せずにクラスのデフォルトのふるまいをオーバーライドできます。これらによって PHP の構文はより簡潔で拡張性のあるものになります。マジックメソッドの名前は2つのアンダースコア (__
) で始まるので、これらを見分けるのは簡単です。
たとえば、オブジェクトを echo
文で表示するとき、カスタム表示フォーマットが開発者によって定義されたのかを確認するために PHP は暗黙のうちにこのオブジェクトの __toString()
メソッドを探します:
[php]
$myObject = new myClass();
echo $myObject;
// マジックメソッドを探す
echo $myObject->__toString();
symfony はマジックメソッドを使うので、これらをよく理解しておくべきです。これらは PHP の公式マニュアル (http://www.php.net/manual/language.oop5.magic.php) で説明されています。
ORM
(symfony で利用する) データベースはリレーショナル (relational) です。PHP と symfony はオブジェクト指向です。オブジェクト指向の方法でデータベースにアクセスするには、オブジェクトのロジックをリレーショナルデータベースのロジックに翻訳するインターフェイスが必要です。このインターフェイスは ORM (Object-Relational Mapping - オブジェクトリレーショナルマッピング) と呼ばれます。
ORM はデータにアクセス可能でビジネスロジックをオブジェクト自身の範囲に留めるオブジェクトで構成されます。
オブジェクト/リレーショナル抽象レイヤーの利点の1つは特定のデータベース固有の構文を使わずにすむことです。これによってモデルオブジェクトの呼び出しは現在のデータベースに最適化された SQL クエリに自動的に変換されます。
このことはプロジェクトの途中で別のデータベースシステムに簡単に切り替えできることを意味します。素早くプロトタイプを書かなければならないが、顧客がどのデータベースシステムが自分のニーズに最適なのかをまだ決めていない状況を想像してください。たとえば、SQLite でアプリケーションの開発を始め、顧客が決断する準備ができたときに、設定ファイルの一行を変更するだけで、MySQL、PostgreSQL もしくは Oracle に切り替えられます。
抽象化レイヤーはデータロジックをカプセル化します。アプリケーションの残りの部分は SQL クエリについて知る必要はないので、データベースにアクセスする SQL を見つけるのは簡単です。データベースプログラミングを専門にする開発者はどこを見ればよいのかを理解しています。
レコードの代わりにオブジェクト、テーブルの代わりにクラスを使うことには別の利点があります。テーブルに新しいアクセサーを追加できることです。たとえば、FirstName
と LastName
の2つのフィールドを持つ Client
という名前のテーブルが存在する場合、たんに Name
を求められるようにしたい場合があります。オブジェクト指向の世界において、これは、つぎのように Client
クラスに新しいアクセサーメソッドを追加することで簡単に実現できます:
[php]
public function getName()
{
return $this->getFirstName().' '.$this->getLastName();
}
繰り返されるすべてのデータアクセス関数とデータのビジネスロジックはこのようなオブジェクトの範囲に保つことができます。たとえば、(オブジェクトである) アイテムを保有する ShoppingCart
クラスを考えてください。会計用のショッピングカートの総数を読みとるには、つぎのように getTotal()
メソッドを追加します:
[php]
public function getTotal()
{
$total = 0;
foreach ($this->getItems() as $item)
{
$total += $item->getPrice() * $item->getQuantity();
}
return $total;
}
このメソッドを使うと、戻される値をオブジェクトレベルで制御できます。後で合計値に影響するような値引きのロジックが追加されることを想像してみてください。これは単純に getTotal()
メソッドや商品の getPrice()
メソッドに追加するだけで、正しい値が返されるようになります。
デフォルトでは、symfony は PHP で最も人気のある 2 つのオープンソース ORM をサポートしています: Propel と Doctrine です。symfony には、これら 2 つがシームレスに統合されています。新しい symfony プロジェクトを作る時、Propel または Doctrine を選択できます。
このドキュメントでは、Propel オブジェクトと Doctrine オブジェクトの使い方を説明しますが、より詳しい説明は、Propel ウェブサイトまたは Doctrine ウェブサイトを参照してください。
RAD
長い間 Web アプリケーションのプログラミングは退屈で時間のかかる作業でした。(たとえばラショナル統一プロセス (Rational Unified Process) のような) 通常のソフトウェアエンジニアリングのライフサイクルに従えば、Web アプリケーションの開発は、要件のドキュメントの完全な一式が揃うまで始めることが不可能で、多くの UML (Unified Modeling Language) のダイアグラムが描かれ、膨大な下準備のドキュメントが生産されました。これは、一般的な開発速度、プログラミング言語が器用ではないこと(ビルド、コンパイル、再起動しなければならず、実際にプログラムを動かさないとわからないこと)、そして、とりわけ、顧客が聞き分けがよく考えをしょっちゅう変えないことを前提としていたためです。
今日において、ビジネスはより早く変化するので、開発の最中に顧客は気が変わりがちです。もちろん、顧客は開発チームにも顧客自身のニーズに適合してアプリケーションの構造を素早く修正することを求めます。幸いにして、Python、Ruby や PHP などのスクリプト言語を利用することで、ラピッドアプリケーション開発 (RAD - Rapid Application Development) もしくはアジャイルソフトウェア開発 (agile software development) などの別のプログラミング戦略を簡単に適用できます。
方法論の理想の1つは開発を始めると同時にできるかぎり早く顧客が動くプロトタイプを再検討して、指示を追加することです。アプリケーションは反復プロセスに組み込まれ、短い開発サイクルのなかで、しだいに機能がリッチなバージョンがリリースされてゆきます。
開発者の結末は無数にあります。開発者は機能を実装しているときに将来を考える必要はありません。使われるメソッドはできるかぎりシンプルで単刀直入であるべきです。この原則は KISS (Keep It Simple, Stupid) の格言で上手に説明されます。
要件が発展するときもしくは機能が追加されるとき、通常では既存のコードの一部を書き換えなければなりません。このプロセスはリファクタリング (refactoring) と呼ばれ、Web アプリケーションの開発プロセスにおいて多く行われます。コードは種類に合わせてほかの場所に移動させます。コードの重複部分を一カ所にまとめるようにリファクタリングが行われます。これは DRY (Don't Repeat Yourself) の原則の適用です。
そしてアプリケーションが定期的に変更されるときにアプリケーションがいつでも動作することを確認するには、自動化できるユニットテスト (unit test - 単体テストとも表記される) のフルセットが必要です。よく書かれているのであれば、ユニットテストはコードの追加もしくはリファクタリングによって何も壊れていないことを保証する堅実な方法です。なかにはコードを書くまえにテストを書くことをとり決める開発の方法論があります。これはテスト駆動開発 (TDD - Test-Driven Development) と呼ばれます。
NOTE アジャイル開発に関連する別の原則やよい習慣はたくさんあります。もっとも効果的なアジャイル開発の方法論の1つはエクストリームプログラミング (XP - Extreme Programming) と呼ばれ、XP の文献はアプリケーションを早くて効率よく開発する方法をたくさん教えてくれます。よい出発点は Kent Beck (ケント・ベック) によって執筆された XP シリーズ (Addison-Wesley) です。
symfony は RAD を実践するための完璧なツールです。当然のことながら、symfony フレームワークは独自プロジェクトのために RAD を適用する Web 制作会社によって開発されました。このことは symfony を利用することは新しい言語を学ぶことではなく、より効率的な方法でアプリケーションを開発するための正しい反射神経と最良の判断を身につけることを意味します。
YAML
YAML の公式サイト (http://www.yaml.org/) によれば、YAML とは「人間が読みやすくスクリプト言語とのインタラクションのために設計され機械が単刀直入に解析できるデータシリアライゼーションフォーマット」です。言い換えると、YAML は XML のような方法で記述されますがはるかにシンプルな構文を使います。このフォーマットはとりわけ配列とハッシュに変換されるデータを記入するために便利です。コードの例はつぎのとおりです:
[php]
$house = array(
'family' => array(
'name' => 'Doe',
'parents' => array('John', 'Jane'),
'children' => array('Paul', 'Mark', 'Simone')
),
'address' => array(
'number' => 34,
'street' => 'Main Street',
'city' => 'Nowheretown',
'zipcode' => '12345'
)
);
つぎの YAML の文字列を解析することで上記の PHP 配列が自動的に作成されます:
[yml]
house:
family:
name: Doe
parents:
- John
- Jane
children:
- Paul
- Mark
- Simone
address:
number: 34
street: Main Street
city: Nowheretown
zipcode: "12345"
YAML において、構造はインデント (字下げ) を通して示され、連続する項目はダッシュ (-) 記号によって表現され、マップ内のキーと値の組はコロン (:) によって区切られます。YAML には同じ構造をより少ない行で記述する省略記法があります。その省略記法では、配列は []
によってハッシュは {}
によって明確に示されます。そのため、前述の YAML データは次のようにより短く表記できます:
[yml]
house:
family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
address: { number: 34, street: Main Street, city: Nowheretown, zipcode: "12345" }
YAML は「YAML Ain't Markup Language」の頭文字語で 「yamel (ヤメル)」と発音します。このフォーマットは2001年ごろから存在しており、YAML パーサーはさまざまなプログラミング言語で実装されています。
TIP YAML フォーマットの仕様ドキュメントは http://www.yaml.org/ で読むことができます。
YAML は XML よりもはるかに素早く記述することが可能で (閉じタグ、明示的なクォートが不要)、(階層をサポートしない) .ini
ファイルよりもずっと強力です。このような理由から、symfony では設定を保存するために YAML 利用します。この本で多くの YAML ファイルを見ることになりますが、とても分かりやすいのでさらに学ぶ必要はないでしょう。
まとめ
symfony は PHP で動くWebアプリケーションフレームワークです。複雑な Web アプリケーションの開発を加速するツールを提供することで、PHP の上に新しいレイヤーを追加します。この本で symfony のすべてをお教えします。必要なのは、モダンプログラミングの基本概念、すなわち、オブジェクト指向プログラミング (OOP)、O/R マッピング (ORM)、ラピッドアプリケーション開発 (RAD) などに慣れていることです。求められる技術的な背景知識は PHP のみです。