TRAJOIN is an Application to Translate symfony documents Jointly.
home > 1.2/book > 01-Introducing-Symfony.txt
symfonyはあなたのために何ができるのでしょうか?使うために何が必要なのでしょうか?この章はこれらの質問にお答えします。
特定の目的のために採用される多くのパターンを自動化することで、フレームワークはアプリケーションの開発を合理化します。またフレームワークは構造をコードに加えることで、開発者により読みやすく維持しやすいコードを書くことを奨励します。フレームワークは複雑な作業を簡単なステートメントにパッケージするので、最終的に、フレームワークはプログラミングをより簡単なものにします。
symfonyは、いくつかの重要な特徴を通してウェブアプリケーションの開発を最適化するために設計された完全なフレームワークです。初心者のために、symfonyはウェブアプリケーションのビジネスルール、サーバのロジック、そしてプレゼンテーションのビューを分離します。symfonyは複雑なウェブアプリケーションの開発期間を短くすることを目的とした多くのツールとクラスを含みます。加えて、開発者がアプリケーションの仕様に完全に集中できるようにsymfonyは共通のタスクを自動化します。これらの利点の最終結果は新しいアプリケーションが作られるたびに車輪を再発明する(reinvent the wheel)必要がないことを意味します!
Symfony is written entirely in PHP 5. It has been thoroughly tested in various real-world projects, and is actually in use for high-demand e-business websites. It is compatible with most of the available databases engines, including MySQL, PostgreSQL, Oracle, and Microsoft SQL Server. It runs on *nix and Windows platforms. Let's begin with a closer look at its features.
symfonyは以下の要件を満たすために開発されました:
ウェブプロジェクトの大部分の共通機能は、次のようにsymfonyの範囲内で自動化されます:
独自のコーディングのガイドラインとプロジェクトの管理ルールを持つ企業の要件を満たすために、symfonyを完全にカスタマイズできます。symfonyは標準でいくつかの開発環境を提供し、一般的なソフトウェアエンジニアリングのタスクを自動化する複数のツールを搭載しています:
プロジェクトの創設者であり、この本の共著者でもあるFabien Potencier(ファビアン・ポタンシェ)によってsymfonyの最初のバージョンは2005年10月に公開されました。FabienはSensio (http://www.sensio.com/)のCEOです。Sensioはフランスのウェブ制作会社でウェブ開発に関して革新的な見解を持つことでよく知られています。
2003年の頃に、Fabienはウェブアプリケーションのための既存のPHPのオープンソース開発ツールの調査に時間を費やしましたが、前に説明した要件を満たすものが存在しないことが判明しました。PHP5が公開されたとき、彼は利用できるツールをフル機能のフレームワークに統合するのに十分に成熟した段階に到達したと判断しました。その後彼はsymfonyのコアの開発に1年費やしました。symfonyのコアはモデル-ビュー-コントローラ(MVC)フレームワークであるMojavi、オブジェクトリレーショナルマッピング(ORM)であるPropel、そしてRuby on Railsのテンプレートヘルパなどがベースとなっています。
Fabienは元々はSensioのプロジェクトのためにsymfonyを開発しました。意のままに使える効率的なフレームワークを保有することはアプリケーションをより速くて効率的な開発を行う理想的な方法を示すからです。これによってウェブ開発がより直感的なものになり、アプリケーションは堅牢で維持が簡単になりました。ランジェリーの小売店用の電子商取引のウェブサイトを開発するためにsymfonyを採用したときにその性能は確かめられました。そしてその後、他のプロジェクトにも適用されました。
symfonyを利用していくつかのプロジェクトが成功した後に、Fabienはsymfonyをオープンソースのライセンスの元で公開しました。公開したのは、作品をコミュニティに寄贈するため、ユーザのフィードバックの恩恵を受けるため、Sensioの経験を展示するため、そして面白いからです。
\"symfony\"が\"FooBarFramework\"ではないのはなぜでしょうか?覚えやすく他の開発ツールを連想しないようにするために、FabienはSensioを表すsとフレームワークを表すfを含む省略名が欲しかったからです。また、彼は大文字も好みませんでした。symfonyは完全な英語ではないとしても十分に英語に近い名前であり、プロジェクトの名前としても利用可能でした。他の代替案は\"baguette\"(フランスパン)でした。
symfonyをオープンソースプロジェクトとして成功させるために、採用率を上げるために、大規模な英語のドキュメントが必要でした。Fabienは仲間のSensio従業員で、この本のもう一人の著者であるFrançois Zaninotto (フランソワ・ザニノット)にコードを徹底的に研究してオンラインの教科書を書くように依頼しました。プロジェクトが公開されてからしばらくかかりましたが、数多くの開発者に対してアピールをするのに十分なドキュメントが作成されました。残りはご存じの通りです。
symfonyのウェブサイト(http://www.symfony-project.org/)が開始されるとすぐに、世界中からたくさんの開発者がフレームワークをダウンロートしてインストールし、オンラインのドキュメントを読み、symfonyで最初のアプリケーションを構築し、興奮のざわめきが始まりました。
当時、ウェブアプリケーションのフレームワークの人気が出つつあり、PHP製のフル機能のフレームワークは高い需要がありました。symfonyは、素晴らしい品質のコードと特筆すべき量のドキュメント、フレームワークのカテゴリにおいて他のプレイヤーを越える2つの長所、のおかげで説得力のある解決方法を提案しました。貢献者がすぐに名乗り出て、パッチと機能の強化を提案し、ドキュメントの校正を行い、他の切望された役割を果たしました。
公開ソースリポジトリ(svn)とチケットシステム(trac)は貢献するための様々な方法を提供し、すべてのボランティアは歓迎されます。Fabienは今もなおソースコードのリポジトリのtrunkの主要なコミッターで、コードの品質を保証します。
今日において、symfonyのフォーラム、メーリングリスト、インターネットリレーチャットチャネル(IRC)はざっと見て一つの質問に対して平均4つの回答を得られる理想的なサポート施設を提供します。毎日新人がsymfonyをインストールし、wikiとコードスニペットのセクションは多くのユーザが投稿したドキュメントをホストしています。symfony製の既知のアプリケーションの数は一週間ごとに平均で合計5個の割合で増えています。
symfonyのコミュニティはこのフレームワークの3番目の強みで、我々執筆者はこの本を読んだ後にあなたも参加して下さることを望んでいます。
あなたがPHP5の専門家であっても、ウェブアプリケーションのプログラミングの新人であってもsymfonyを使えるようになります。symfonyで開発をするかどうか決める主な要因はあなたのプロジェクトの規模です。
データベースへのアクセスが制限されており、5ページから10ページ程度の簡単なウェブサイトを開発したい場合で、パフォーマンスを保証するもしくはドキュメントを提供する義務がない場合、PHP単体のコードにこだわるべきでしょう。ウェブアプリケーションのフレームワークから多くのことを得られず、おそらくはオブジェクト指向もしくはMVCモデルが開発プロセスを遅らせることになるでしょう。追記として、symfonyはPHPスクリプトがCGI(コモンゲートウェイインタフェース)のみで動作する共有サーバ上で効率的に動作するように最適化されていません。
一方で、重いビジネスロジックを持った、もっと複雑なウェブアプリケーションを開発する場合、単独のPHPでは十分ではありません。将来アプリケーションを維持するもしくは拡張することを計画する場合、コードを軽量に、読みやすく、効果的なものにすることが必要になります。直感的な方法で(Ajaxのような)ユーザのインタラクションの最新機能を使いたい場合、JavaScriptを数百行書くだけではすまされません。楽しく速く開発したい場合、単独のPHPだけではおそらく失望してしまうでしょう。これらすべての場合において、symfonyはあなたを支援します。
そして、もちろん、あなたがプロのウェブ開発者であるなら、既にウェブアプリケーションのすべての利点を理解しており、成熟し、充実したドキュメントがあり、大きなコミュニティを持つフレームワークが必要です。もう検索しなくても、symfonyがあなたの解決策です。
視覚的なデモンストレーションがお好みなら、symfonyのウェブサイトからスクリーンキャストをご覧下さい。symfonyでアプリケーションを開発することがどんなに速くて楽しいことなのかわかるでしょう。
symfonyで始める前に、いくつかの基本的な概念を理解しておきます。OOP、ORM、RAD、DRY、KISS、TDD、YAMLとPEARの意味を既にご存じでしたら、読み飛ばして下さい。
symfonyはPHP5(http://www.php.net)で開発され、同言語でウェブアプリケーションを開発することを専門としてしています。それゆえ、フレームワークを最大限に活用するためにPHP5をしっかりと理解していることが必要です。symfonyを動かすために必要なPHPの最小限のバージョンは5.2です。
既にPHP4を知っているがPHP5を知らない開発者はこの言語の新しいオブジェクト指向のモデルに主な焦点を当てるべきです。
オブジェクト指向プログラミング(OOP - Object-oriented programming)はこの章では説明しません。1冊の本が必要だからです! symfonyはPHP5で利用できるオブジェクト指向のメカニズムを広範囲で活用しているので、OOPはsymfonyを学ぶための必須条件です。
WikipediaにおいてOOPは次のように説明されています:
オブジェクト指向プログラミングの背景にある考え方は、プログラムを関数の集まりもしくはコンピュータへの単なる命令の一覧と見なす伝統的な見方とは対照的に、コンピュータプログラムはお互いに影響を与える個別のユニット、もしくはオブジェクトの集まりを構成するものとして見なすことです。
PHP5はクラス、オブジェクト、メソッド、継承やその他のオブジェクト指向のパラダイムを実装します。これらの概念になじみがない方はhttp://www.php.net/manual/ja/language.oop5.basic.phpで利用できるPHPの関連ドキュメントを読むことをお勧めします。
PHPのオブジェクト機能の強みの一つはマジックメソッド(magic method)を利用できることです。これらのメソッドは外部コードの修正を行わずにクラスのデフォルトの振る舞いをオーバーライドできます。これらによってPHPの構文はより簡潔で拡張性のあるものになります。マジックメソッドの名前は2つのアンダースコア(__)で始まるので、これらを区別することは簡単です。
例えば、オブジェクトを表示するとき、カスタムの表示フォーマットが開発者によって定義されたのかを確認するためにPHPは暗黙のうちにこのオブジェクトのための__toString()メソッドを探します:
$myObject = new myClass();
echo $myObject;
// マジックメソッドを探します
echo $myObject->__toString();
symfonyはマジックメソッドを利用するので、これらを徹底的に理解すべきです。これらはPHPの公式マニュアル(http://www.php.net/manual/ja/language.oop5.magic.php)で説明されています。
PEARは"再利用可能なPHPコンポーネントのためのフレームワークかつ配布システム"です。PEARによってPHPスクリプトのダウンロード、インストール、アップグレード、アンインストールが可能になります。PEARパッケージを利用するとき、どこにスクリプトを設置するのか、どのようにして利用可能にするのか、もしくはどのようにしてコマンドラインインタフェース(CLI)を拡張するかなどについて悩む必要はありません。
PEARはPHPで書かれたコミュニティ駆動のプロジェクトで、標準的なPHPディストリビューションに搭載されています。
PEARのウェブサイト、http://pear.php.net/、はドキュメントとカテゴリによって分類されたパッケージを提供します。
PEARはPHPのベンダーのライブラリをインストールするための最もプロフェッショナルな方法です。symfonyの開発において複数のプロジェクトにまたがってライブラリを集中管理するためにPEARを利用することが推奨されます。symfonyのプラグインは特別な設定を持つPEARパッケージです。symfonyフレームワーク自身がPEARパッケージとして利用できます。
symfonyを利用するためにPEARの構文に関するすべての内容を知る必要はありません。symfonyが何を行い何をインストールしたのかだけを理解しておく必要があります。CLIで次のコマンドを入力すればコンピュータにインストールされたPEARを確認できます:
> pear info pear
このコマンドはインストールされたPEARのバージョン番号を返します。
symfonyのプロジェクトは独自のPEARリポジトリもしくはチャネルを持ちます。チャネルはバージョン1.4.0以降のPEARで利用可能なので、バージョンが古い場合はアップグレードすべきです。PEARのバージョンをアップグレードするためには、次のコマンドを入力します:
> pear upgrade PEAR
(symfonyで利用する)データベースはリレーショナル(relational)です。PHP5とsymfonyはオブジェクト指向です。オブジェクト指向の方法でデータベースにアクセスするためには、オブジェクトのロジックをリレーショナルデータベースのロジックに翻訳するインタフェースが必要です。このインタフェースはオブジェクトリレーショナルマッピング(object-relational mapping)もしくはORMと呼ばれます。
ORMはデータにアクセス可能でビジネスロジックをオブジェクト自身に保つオブジェクトで構成されます。
オブジェクト/リレーショナル抽象レイヤーの利点の1つは特定のデータベース固有の構文を使わずに済むことです。これによってモデルオブジェクトへの呼び出しは現在のデータベースに最適化されたSQLクエリに自動的に変換されます。
このことはプロジェクトの途中で別のデータベースシステムに簡単に切り替えできることを意味します。素早くプロトタイプを書かなければならないが、顧客がどのデータベースシステムが自分のニーズに最適なのかをまだ決めていない状況を想像して下さい。例えば、SQLiteでアプリケーションの開発を始め、顧客が決心する準備ができたときにMySQL、PostgreSQL、もしくはOracleに切り替えることができます。設定ファイルの一行を変えるだけで、動作します。
抽象化レイヤーはデータロジックをカプセル化します。アプリケーションの残りの部分はSQLクエリについて知る必要はないので、データベースにアクセスするSQLを見つけることは簡単です。データベースプログラミングを専門にする開発者は見る場所も理解しています。
レコードの代わりにオブジェクト、テーブルの代わりにクラスを使うことには別の利点があります: 新しいアクセサをテーブルに追加できます。例えば、FirstNameとLastNameの2つのフィールドを持つClientという名前のテーブルが存在する場合、単にNameを求めることを可能にしたい場合があります。オブジェクト指向の世界において、これは、次のように新しいアクセサメソッドをClientクラスに追加することと同じぐらい簡単です:
public function getName()
{
return $this->getFirstName().' '.$this->getLastName();
}
All the repeated data-access functions and the business logic of the data
can be maintained within such objects. For instance, consider a class ShoppingCart
in which you keep items (which are objects). To retrieve the full amount of the
shopping cart for the checkout, you can add a getTotal() method, like this:
public function getTotal()
{
$total = 0;
foreach ($this->getItems() as $item)
{
$total += $item->getPrice() * $item->getQuantity();
}
return $total;
}
Using this method we are able to control the values returned from an object level. Imagine if later there is a decision to add some discount logic which affects the total - it can simply be added to the getTotal() method or even to the getPrice() methods of the items and the correct value would be returned.
別のオープンソースプロジェクトであるPropelは現時点でPHP5のためのベストなオブジェクト/リレーショナル抽象化レイヤーの一つです。PropelはデフォルトのORMとしてシームレスにsymfonyに統合されるので、この本で説明される大抵のデータの操作方法はPropelの構文に従います。この本はPropelオブジェクトの使い方を説明しますが、もっと完全なリファレンスについては、Propelのウェブサイト(http://propel.phpdb.org/trac/)を訪問することをお勧めします。
symfony 1.1では、Propelはプラグインとしてsymfonyに搭載されており、よって簡単に他のORMに切り替えることができます。実際のところ、もしDoctrineを主要なORMツールとして使いたい場合には、sfDoctrinePluginのインストールが必要なだけです。
長い間ウェブアプリケーションをプログラミングすることは退屈で遅い作業でした。(例えばラショナル統一プロセス(Rational Unified Process)のような)通常のソフトウェアエンジニアリングのライフサイクルに従えば、ウェブアプリケーションの開発は、要件のドキュメントの完全な一式が揃うまで始めることが不可能で、多くのUML(Unified Modeling Language)のダイアグラムの図が描かれ、膨大な量の下準備のドキュメントが生産されました。これは、一般的な開発速度、プログラミング言語が器用ではないこと(ビルド、コンパイル、再起動しなければならず、実際にプログラムを動かさないとわからないということ)、そして、とりわけ、顧客が聞き分けが良く考えをしょっちゅう変えないことを前提としていたためです。
今日において、ビジネスはより早く変化するので、顧客はプロジェクト開発の最中に考えをしゅっちょう変える傾向にあります。もちろん、顧客は開発チームにも自身のニーズに適合してアプリケーションの構造を素早く修正することを求めます。幸いにして、PerlやPHPなどのスクリプト言語を利用することで、ラピッドアプリケーション開発(RAD - Rapid Application Development)もしくはアジャイルソフトウェア開発(agile software development)などの別のプログラミング戦略を簡単に適用できます。
方法論の理想の1つは開発を始めると同時にできる限り早く顧客が動くプロトタイプを再検討して、追加の指示を行うことです。アプリケーションは反復プロセスに組み込まれ、短い開発サイクルの中で、だんだんと機能がリッチなバージョンがリリースされます。
開発者の結末は無数にあります。開発者は機能を実装しているときに将来を考える必要はありません。使われるメソッドはできる限りシンプルで単刀直入であるべきです。この原則はKISS(Keep It Simple, Stupid)の格言でうまく説明されます。
要件が発展するときもしくは機能が追加されるとき、通常では既存のコードの一部を書き換えなければなりません。このプロセスはリファクタリング(refactoring)と呼ばれ、ウェブアプリケーションの開発過程において多く行われます。コードは種類に合わせて他の場所に移動させます。コードの重複部分を一カ所にまとめるようにリファクタリングが行われます。これはDRY(Don't Repeat Yourself)の原則を適用したものです。
そしてアプリケーションが定期的に変更されるときにアプリケーションがいつでも動作することを確認するためには、自動化できる単体テスト(unit test - ユニットテストとも表記される)のフルセットが必要です。よく書かれているのであれば、単体テストはコードの追加もしくはリファクタリングによって何も壊れていないことを保証する堅実な方法です。開発の方法論の中にはコードを書く前にテストを書くことを取り決めるものがあります。これはテスト駆動開発(TDD - Test-Driven Development)と呼ばれます。
アジャイル開発に関連した別の原則やよい習慣はたくさんあります。最も効果的なアジャイル開発の方法論の一つはエクストリームプログラミング(Extreme Programming - XPに短縮される)と呼ばれ、XPの文献はアプリケーションを早くて効率的な方法で開発する方法をたくさん教えてくれます。よい出発点はKent Beck(ケント・ベック)によって執筆されたXPシリーズ(Addison-Wesley)です。
symfonyはRADのための完璧なツールです。当然のことながら、symfonyフレームワークは独自プロジェクトのためにRADを適用するウェブ制作会社によって開発されました。このことはsymfonyを利用することは新しい言語を学ぶことではなく、より効率的な方法でアプリケーションを開発するための正しい反射神経と最良の判断を身につけることを意味します。
公式のYAMLウェブサイト(http://www.yaml.org/)によれば、YAMLとは"人間が読みやすくスクリプト言語とのインタラクションのために設計され機械が単刀直入に解析できるデータのシリアライゼーションフォーマット"です。言い換えると、YAMLはXMLのような方法で記述されますが遙かにシンプルな構文を利用します。このフォーマットはとりわけ配列とハッシュに変換されるデータを記述をするために便利です。例は次の通りです:
$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の配列が自動的に作成されます:
house:
family:
name: Doe
parents:
- John
- Jane
children:
- Paul
- Mark
- Simone
address:
number: 34
street: Main Street
city: Nowheretown
zipcode: "12345"
YAMLにおいて、構造はインデント(字下げ)を通して示され、連続する項目はダッシュ(-)記号によって表現され、マップ内のキーと値の組はコロン(:)によって分割されます。YAMLには同じ構造をより少ない行で記述する省略記法があります。その省略記法では、配列は[]によってハッシュは{}によって明確に示されます。そのため、前述のYAMLのデータは次のようにより短い方法で書くことができます:
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パーサが実装されています。
YAMLフォーマットの仕様ドキュメントはhttp://www.yaml.org/で利用できます。
YAMLはXMLよりも遙かに素早く記述することが可能で(閉じタグ、明示的なクォートが不要)、.iniファイルよりもずっと強力です(階層をサポートしない)。symfonyが設定を保存するためにYAMLを望ましい言語として利用する理由はそういうわけです。この本で多くのYAMLファイルを見ることになりますが、とても分かりやすいのでおそらくさらに学ぶ必要はないでしょう。
symfonyはPHP5で動くウェブアプリケーションフレームワークです。複雑なウェブアプリケーションの開発を加速するツールを提供することで、 PHPの上に新しいレイヤーを追加します。この本でsymfonyのすべてをお教えします。そして、必要なのは、現代プログラミングの基本概念、すわなち、オブジェクト指向プログラミング(OOP)、O/Rマッピング(ORM)、ラピッドアプリケーション開発(RAD)など、に慣れていることです。求められる技術的な背景知識はPHP5のみです。