symfony book 日本語ドキュメント

第1章 - symfonyの紹介

symfonyはあなたのために何ができるのでしょうか?使うために何が必要なのでしょうか?この章はこれらの質問にお答えします。

symfonyとは

特定の目的のために採用される多くのパターンを自動化することで、フレームワークはアプリケーションの開発を合理化します。またフレームワークは構造をコードに加えることで、開発者により読みやすく維持しやすいコードを書くことを奨励します。フレームワークは複雑な作業を簡単なステートメントにパッケージにするので、最終的に、フレームワークはプログラミングをより簡単なものにします。

symfonyは、いくつかの重要な特徴を通してWebアプリケーションの開発を最適化するために設計された完全なフレームワークです。初心者のために、symfonyはWebアプリケーションのビジネスルール、サーバーのロジック、そしてプレゼンテーションのビューを分離します。symfonyは複雑なWebアプリケーションの開発期間を短くすることを目的とした多くのツールとクラスを含みます。加えて、開発者がアプリケーションの仕様に完全に集中できるようにsymfonyは共通のタスクを自動化します。これらの利点の最終結果は新しいアプリケーションが作られるたびに車輪を再発明する(reinvent the wheel)必要がないことを意味します!

symfonyは完全にPHP 5で書かれました。symfonyは現実の世界のさまざまなプロジェクトで徹底的にテストされ、高い需要のある電子商取引のWebサイトでも実際に利用されています。symfonyはMySQL、PostgreSQL、Oracle、Microsoft SQL Serverを含む、利用可能なほとんどのデータベースエンジンと互換性があります。symfonyはUnix系やWindowsプラットフォーム上で動作します。機能に関してより詳しく見ることにします。

symfonyの機能

symfonyは以下の要件を満たすために開発されました:

自動化されたWebプロジェクト機能

Webプロジェクトの大部分の共通機能は、つぎのようにsymfonyの範囲内で自動化されます:

開発環境とツール

独自のコーディングのガイドラインとプロジェクトの管理ルールを持つ企業の要件を満たすために、symfonyを完全にカスタマイズできます。symfonyはデフォルトでいくつかの開発環境を提供し、共通のソフトウェアエンジニアリングのタスクを自動化する複数のツールを搭載しています:

symfonyを作ったのは誰?なぜ?

プロジェクトの創設者であり、この本の共著者でもあるFabien Potencier(ファビアン・ポタンシェ)によってsymfonyの最初のバージョンは2005年10月に公開されました。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従業員で、この本のもう一人の著者であるFrançois Zaninotto (フランソワ・ザニノット)にコードを徹底的に研究してオンラインの教科書を書くように依頼しました。プロジェクトが公開されてからしばらくかかりましたが、数多くの開発者に対してアピールをするのに十分なドキュメントが作成されました。残りはご存じのとおりです。

symfonyのコミュニティ

symfonyのWebサイト(http://www.symfony-project.org/)が開始されると同時に、世界中からたくさんの開発者がフレームワークをダウンロートしてインストールし、オンラインのドキュメントを読み、symfonyで最初のアプリケーションを構築し、興奮のざわめきが始まりました。

当時、Webアプリケーションのフレームワークの人気が出つつあり、PHP製のフル機能のフレームワークは高い需要がありました。symfonyは、すばらしい品質のコードと特筆すべき量のドキュメント、フレームワークのカテゴリにおいてほかのプレイヤーを越える2つの長所、のおかげで説得力のある解決方法を提案しました。貢献者がすぐに名乗り出て、パッチと機能の強化を提案し、ドキュメントの校正を行い、ほかの切望された役割を果たしました。

公開ソースリポジトリ(svn)とチケットシステム(trac)は貢献するためのさまざまな方法を提供し、すべてのボランティアは歓迎されます。Fabienは今もなおソースコードのリポジトリのtrunkの主要なコミッターで、コードの品質を保証します。

今日において、symfonyのフォーラム、メーリングリスト、インターネットリレーチャットチャンネル(IRC)はざっと見て一つの質問に対して平均4つの回答を得られる理想的なサポート施設を提供します。毎日新人がsymfonyをインストールし、wikiとコードスニペットのセクションは多くのユーザーが投稿したドキュメントをホストしています。symfony製の既知のアプリケーションの数は一週間ごとに平均で合計5個の割合で増えています。

symfonyのコミュニティはこのフレームワークの3番目の強みで、我々執筆者はこの本を読んだ後にあなたも参加して下さることを望んでいます。

symfonyは私の用途に合っていますか?

あなたがPHP 5の専門家であっても、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とPEARの意味をすでにご存じでしたら、読み飛ばしてください。

PHP 5

symfonyはPHP 5(http://www.php.net)で開発され、同言語でWebアプリケーションを開発することを専門としてしています。それゆえ、フレームワークを最大限に活用するためにPHP 5をしっかりと理解していることが必要です。

すでにPHP 4を知っているがPHP 5を知らない開発者はこの言語の新しいオブジェクト指向のモデルに主な焦点を当てるべきです。

オブジェクト指向プログラミング(OOP)

オブジェクト指向プログラミング(OOP - Object-oriented programming)はこの章では説明しません。1冊の本が必要だからです! symfonyはPHP 5で利用できるオブジェクト指向のメカニズムを広範囲で活用しているので、OOPはsymfonyを学ぶための必須条件です。

WikipediaにおいてOOPはつぎのように説明されています:

オブジェクト指向プログラミングの背景にある考え方は、プログラムを関数の集まりもしくはコンピュータへの単なる命令の一覧とみなす伝統的な見方とは対照的に、コンピュータプログラムはお互いに影響を与える個別のユニット、もしくはオブジェクトの集まりをコンフィギュレーションするものとしてみなすことです。

PHP 5はクラス、オブジェクト、メソッド、継承やそのほかのオブジェクト指向のパラダイムを実装します。これらの概念になじみがない方はhttp://www.php.net/manual/language.oop5.basic.phpで利用できるPHPの関連ドキュメントを読むことをお勧めします。

マジックメソッド

PHPのオブジェクト機能の強みの一つはマジックメソッド(magic method)を利用できることです。これらのメソッドは外部コードの修正を行わずにクラスのデフォルトのふるまいをオーバーライドできます。これらによってPHPの構文はより簡潔で拡張性のあるものになります。マジックメソッドの名前は2つのアンダースコア(__)で始まるので、これらを区別することは簡単です。

たとえば、オブジェクトを表示するとき、カスタム表示フォーマットが開発者によって定義されたのかを確認するためにPHPは暗黙のうちにこのオブジェクトのための__toString()メソッドを探します:

[php]
$myObject = new myClass();
echo $myObject;
// マジックメソッドを探す
echo $myObject->__toString();

symfonyはマジックメソッドを利用するので、これらを徹底的に理解すべきです。これらはPHPの公式マニュアル(http://www.php.net/manual/language.oop5.magic.php)で説明されています。

PHP Extension and Application Repository (PEAR)

PEARは"再利用可能なPHPコンポーネントのためのフレームワークかつ配布システム"です。PEARによってPHPスクリプトのダウンロード、インストール、アップグレード、アンインストールが可能になります。PEARパッケージを利用するとき、どこにスクリプトを設置するのか、どのようにして利用可能にするのか、もしくはどのようにしてコマンドラインインターフェイス(CLI)を拡張するかなどについて悩む必要はありません。

PEARはPHPで書かれたコミュニティ駆動のプロジェクトで、標準的なPHPディストリビューションに搭載されています。

TIP PEARのWebサイト、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

オブジェクトリレーショナルマッピング(ORM)

(symfonyで利用する)データベースはリレーショナル(relational)です。PHP 5とsymfonyはオブジェクト指向です。オブジェクト指向の方法でデータベースにアクセスするには、オブジェクトのロジックをリレーショナルデータベースのロジックに翻訳するインターフェイスが必要です。このインターフェイスはオブジェクトリレーショナルマッピング(object-relational mapping)もしくはORMと呼ばれます。

ORMはデータにアクセス可能でビジネスロジックをオブジェクト自身に保つオブジェクトで構成されます。

ORMの利点の1つは特定のデータベース固有の構文を使わずにすむことです。これによってモデルオブジェクトへの呼び出しは現在のデータベースに最適化されたSQLクエリに自動的に変換されます。

このことはプロジェクトの途中で別のデータベースシステムに簡単に切り替えできることを意味します。素早くプロトタイプを書かなければならないが、顧客がどのデータベースシステムが自分のニーズに最適なのかをまだ決めていない状況を想像してください。たとえば、SQLiteでアプリケーションの開発を始め、顧客が決心する準備ができたときにMySQL、PostgreSQL、もしくはOracleに切り替えることができます。設定ファイルの一行を変えるだけで、動作します。

抽象化レイヤーはデータロジックをカプセル化します。アプリケーションの残りの部分はSQLクエリについて知る必要はないので、データベースにアクセスするSQLを見つけることは簡単です。データベースプログラミングを専門にする開発者は見る場所も理解しています。

レコードの代わりにオブジェクト、テーブルの代わりにクラスを使うことには別の利点があります: 新しいアクセサーをテーブルに追加できます。たとえば、FirstNameLastNameの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;
}

これでお終いです。同じことを行うSQLクエリを書くためにどれだけの時間がかかるのか想像してください!

別のオープンソースのプロジェクトであるPropelは現時点でPHP 5のためのベストなORMの1つです。Propelはシームレスにsymfonyに統合されるので、この本で説明されるたいていのデータ操作はPropelの構文に従います。この本はPropelのオブジェクトの使いかたを説明しますが、もっと完全なリファレンスについては、PropelのWebサイト(http://propel.phpdb.org/trac/)を訪問することをお勧めします。

ラピッドアプリケーション開発(RAD)

長い間Webアプリケーションをプログラミングすることは退屈で遅い作業でした。(たとえばラショナル統一プロセス(Rational Unified Process)のような)通常のソフトウェアエンジニアリングのライフサイクルに従えば、Webアプリケーションの開発は、要件のドキュメントの完全な一式が揃うまで始めることが不可能で、多くのUML(Unified Modeling Language)のダイアグラムの図が描かれ、膨大な量の下準備のドキュメントが生産されました。これは、一般的な開発速度、プログラミング言語が器用ではないこと(ビルド、コンパイル、再起動しなければならず、実際にプログラムを動かさないとわからないということ)、そして、とりわけ、顧客が聞き分けがよく考えをしょっちゅう変えないことを前提としていたためです。

今日において、ビジネスはより早く変化するので、顧客はプロジェクト開発の最中に考えをしゅっちょう変える傾向にあります。もちろん、顧客は開発チームにも自身のニーズに適合してアプリケーションの構造を素早く修正することを求めます。幸いにして、PerlやPHPなどのスクリプト言語を利用することで、ラピッドアプリケーション開発(RAD - Rapid Application Development)もしくはアジャイルソフトウェア開発(agile software development)などの別のプログラミング戦略を簡単に適用できます。

方法論の理想の1つは開発を始めると同時にできるかぎり早く顧客が動くプロトタイプを再検討して、追加の指示を行うことです。アプリケーションは反復プロセスに組み込まれ、短い開発サイクルのなかで、だんだんと機能がリッチなバージョンがリリースされます。

開発者の結末は無数にあります。開発者は機能を実装しているときに将来を考える必要はありません。使われるメソッドはできるかぎりシンプルで単刀直入であるべきです。この原則はKISS(Keep It Simple, Stupid)の格言でうまく説明されます。

要件が発展するときもしくは機能が追加されるとき、通常では既存のコードの一部を書き換えなければなりません。このプロセスはリファクタリング(refactoring)と呼ばれ、Webアプリケーションの開発過程において多く行われます。コードは種類に合わせてほかの場所に移動させます。コードの重複部分を一カ所にまとめるようにリファクタリングが行われます。これはDRY(Don't Repeat Yourself)の原則を適用したものです。

そしてアプリケーションが定期的に変更されるときにアプリケーションがいつでも動作することを確認するには、自動化できるユニットテストのフルセットが必要です。よく書かれているのであれば、機能テストはコードの追加もしくはリファクタリングによって何も壊れていないことを保証する堅実な方法です。開発の方法論のなかにはコードを書くまえにテストを書くことをとり決めるものがあります。これはテスト駆動開発(TDD - Test-Driven Development)と呼ばれます。

NOTE アジャイル開発に関連する別の原則やよい習慣はたくさんあります。もっとも効果的なアジャイル開発の方法論の一つはエクストリームプログラミング(XP - Extreme Programming)と呼ばれ、XPの文献はアプリケーションを早くて効率的な方法で開発する方法をたくさん教えてくれます。よい出発点はKent Beck(ケント・ベック)によって執筆されたXPシリーズ(Addison-Wesley)です。

symfonyはRADのための完璧なツールです。当然のことながら、symfonyフレームワークは独自のプロジェクトのためにRADを適用するWeb制作会社によって開発されました。このことはsymfonyを利用することは新しい言語を学ぶことではなく、より効率的な方法でアプリケーションを開発するための正しい反射神経と最良の判断を身につけることを意味します。

symfonyのプロジェクトのWebサイトはアジャイルな方法でアプリケーションの開発を段階的に説明するチュートリアルを提示しています。このチュートリアルはaskeet(http://www.symfony-project.org/askeet )と呼ばれ、アジャイルな開発をさらに学びたい方は読むことをお勧めします。

YAML

YAMLの公式Webサイト(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の配列が自動的に作成されます:

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パーサーが実装されています。

TIP YAMLフォーマットの仕様ドキュメントはhttp://www.yaml.org/で利用できます。

YAMLはXMLよりもはるかに素早く記述することが可能で(閉じタグ、明示的なクォートが不要)、.iniファイルよりもずっと強力です(階層をサポートしない)。symfonyが設定を保存するためにYAMLを望ましい言語として利用する理由はそういうわけです。この本で多くのYAMLファイルを見ることになりますが、とても分かりやすいのでおそらくさらに学ぶ必要はないでしょう。

まとめ

symfonyはPHP 5で動くWebアプリケーションフレームワークです。複雑なWebアプリケーションの開発を加速するツールを提供することで、 PHPの上に新しいレイヤーを追加します。この本でsymfonyのすべてをお教えします。そして、必要なのは、現代プログラミングの基本概念、すわなち、オブジェクト指向プログラミング(OOP)、O/Rマッピング(ORM)、ラピッドアプリケーション開発(RAD)など、に慣れていることです。求められる技術的な背景知識はPHP 5のみです。