Development

Documentation/ja_JP/book/1.0/01-Introducing-Symfony

You must first sign up to be able to contribute.

Version 20 (modified by heihachiro, 11 years ago)
--

第一章 symfonyの紹介

「symfonyでなにができるって?」 「symfonyを使うには何が必要なの?」 この章ではそんな問いに答えます。

symfony 概略

フレームワークは特定の目的のために使用される多くのパターンを自動化することで、アプリケーションの開発を効率化します。またフレームワークはコードを構造化し、開発者に対しより読みやすくメンテナンスし易いコードを書くように促します。つまりフレームワークは、複雑な操作を単純な記述にパッケージ化することによってプログラミングを容易にします。

symfonyはいくつかのキーとなる機能によってウェブアプリケーションの開発に最適化された完全なフレームワークです。ウェブアプリケーションのビジネスルールと、サーバのロジック、そして見た目の表示を分割します。たくさんのツールと、複雑なウェブアプリケーションの開発時間を短縮するためのクラスを含んでいます。また、ウェブアプリケーション開発において共通の作業を自動化することで、開発者はそのアプリケーションに固有の部分に集中することが可能になります。これらの利点は、ウェブアプリケーションを開発するたびに車輪を再発明する必要は無いということを意味します!

symfonyはすべてPHPのVersion 5で開発されました。さまざまな現実世界のプロジェクトでじっくりとテストされています。実際、高い信頼性が要求される電子商取引の世界でも使用されています。およそ使用可能なほとんどのデータベースエンジン、- MySQL, PostgreSQL, Oracle, Microsoft SQL Server - と互換性があり、Unix系のOSや、Windowsプラットフォームで動作します。ではもっと詳しく見てみましょう。

symfonyの特徴

symfonyは次の要求を満たすよう作られています。

  • 大抵のプラットフォームでインストールと設定が容易であること(そして標準的なUnix系OSやWindowsプラットフォームでの動作が保障されていること)。
  • 特定のデータベースに依存しないこと。
  • 多くのケースでは簡単に扱えて、しかし複雑なケースにも対応できるフレキシブルさを保つこと。
  • 「設定より規約」という前提にもとづくこと。開発者が規約の及ばないものだけ設定すればよい。
  • 多くのウェブのベストプラクティスとデザインパターンに従うこと。
  • Enterprise-ready--adaptable to existing information technology (IT) policies and architectures, そして長期間のプロジェクトでも安定して動作すること。
  • メンテナンスし易いように、とても読みやすいコード、phpDocumentor形式のコメントを生成すること。
  • 簡単に拡張でき、ほかのベンダーによるライブラリとの統合を可能にすること。

ウェブプロジェクトの自動生成

多くのウェブプロジェクトで共通の操作は、以下のようにsymfonyにおいては自動化されています。

  • 組み込みの国際化レイヤーは、コンテンツのローカライズだけでなく、データやインターフェース層の翻訳も可能にします。
  • プレゼンテーション層では、フレームワークの知識の無いHTMLデザイナーでも作成できるテンプレートとレイアウトを用います。ヘルパーは大量のコードを単純な関数の呼び出しにまとめることで、プレゼンテーション層のコードを減らします。
  • フォームは入力値の検証とデータの自動入力をサポートし、データベース内のデータの質とユーザの使いやすさを高めます。
  • 出力のエスケープ処理は、不正なデータによる攻撃からアプリケーションを守ります。
  • キャッシュ機能は、回線の使用容量とサーバの負荷を節約します。
  • 認証とクリデンシャル機能は、コンテンツのアクセス制限やユーザのセキュリティ管理を実現します。
  • ルーティング機能とスマートURL機能は、ページのURLをインターフェースの一部とし、サーチエンジンに優しくします。
  • 組み込みの電子メール機能とAPI機能は、古典的なブラウザでのアクセスを超える機能をウェブアプリケーションにもたらします。
  • 自動のページ分割機能、ソート機能、フィルタリング機能のおかげで、よりユーザにわかり易いデータの一覧表示を可能にします。
  • ファクトリー機能、プラグイン機能、mixin機能は、高レベルな拡張を可能にします。
  • ブラウザ毎のJavaScriptの動作の違いを吸収したヘルパーによって、Ajaxインタラクションの実装を容易にします。.

開発環境とツール

様々の会社で用いられているコーディング規約や、プロジェクト管理ルールの要求に応えるべく、symfonyは完全にカスタマイズすることができます。デフォルトで様々な開発環境が提供され、ソフトウェアにおいて共通の作業を自動化する多様なツールがバンドルされています。

  • コード生成ツールはプロトタイプ作成や、ワンクリックのバックエンド管理ツールの作成にもってこいです。
  • 組み込みのユニットテストと機能テスト用のフレームワークは、テスト駆動開発のために完璧な道具を提供します。
  • デバッグ表示パネルは、実際に動作しているページに開発者が必要とする情報を表示し、デバッグ作業を効率化します。
  • コマンドラインインターフェースは、2つのサーバ間のアプリケーションの配置を自動化します。
  • アプリケーションの設定を即時に変更、反映させることが可能です。
  • ログ機能は、アプリケーションの動作についての詳細な情報を管理者に提供します。

誰が、何のためにsymfonyを開発したのか?

symfonyの最初のバージョンは、プロジェクトの創始者である、Fabien Potencier(この本の共著者)によって、2005年の10月にリリースされました。Fabienはウェブ開発における革新的な考察でよく知られるフランスのウェブ代理店 Sensio (http://www.sensio.com/) のCEOです。

2003年、FabienはPHPでのウェブアプリケーションのオープンソースの開発ツールを探していました。彼は、あらかじめ考えていた要件を満たすものは無いことに気づきました。PHP5がリリースされたとき、彼は手に入れることのできるツールが、フル機能のフレームワークに統合されるために十分に枯れた段階に到達したと考えました。その後1年間、Movavi Model-View-Controller(MVC)フレームワークや、Propel, Object-relational mapping(ORM), Ruby on Railsのテンプレートのヘルパーなどをベースにsymfonyの基本部分の開発に費やしました。

Fabienは元々、symfonyをSensioのプロジェクトの為に開発しました。自由に扱える効果的なフレームワークを持つことが、アプリケーション開発をより早くより効率的にするための理想的な手段だからです。それはまた、ウェブ開発をより直感的にし、出来上がったアプリケーションはより堅牢で、よりメンテナンスし易くなります。婦人用下着のEコマースのウェブサイト開発に用いられるようになり、フレームワークは性能を計る段階に入り、また他のプロジェクトにも用いられるようになりました。

いくつかのプロジェクトでsymfonyを用いた開発がうまく行き、Fabienはsymfonyをオープンソースのライセンスで公開することを決めました。そうしてこの成果をコミュニティに寄贈したのは、ユーザからのフィードバックを得るため、またSensioの仕事のショーケースとするためです。そしてそれが楽しいからです。

Note
なぜsymfonyは"なんとかフレームワーク"とかいった名前ではないんでしょう? それはFabienが"s"の文字(Sensioのように)と、"f"の文字(frameworkのように)を含んでいる短い名前で、覚えやすく、ほかの開発ツールと関連の無い名前を望んだからです。また、彼は大文字が好きではありません。symfonyは、完全に英語ではありませんが、それにぴったりでした。またプロジェクトの名前としても用いることができます。他の候補としては"baguette"というのがありました。

symfonyがオープンソースプロジェクトとして成功する為には、たくさんのドキュメント、それも採用事例を増やす為に英語の、が必要でした。FabienはSensioの仲間の従業員であるFrançois Zaninotto(この本のもう一人の著者)に、コードを詳しく調べて、オンラインの文書を書くように頼みました。かなり長い時間かかりましたが、プロジェクトが公開されるころには、たくさんの開発者を惹きつけるだけのドキュメントができあがりました。The rest is history.

symfonyのコミュニティ

symfonyのウェブサイト (http://www.symfony-project.com/) が公開されるとすぐに世界中のたくさんの開発者がフレーワークをダウンロード、インストールし、オンラインドキュメントを読み、symfonyを用いたアプリケーションを開発し、その噂が広がり始めました。

その時点でウェブアプリケーションフレームワークは広く知られており、PHPによるフル機能のフレームワークが待望されていました。symfonyはコードの質の高さと大量のドキュメント、この大きな2つの他のフレームワークに勝る利点で、開発者を惹きつけるソリューションを提供しました。すぐにパッチや機能の改善をを提供したり、ドキュメントの査読などに貢献する開発者が現れるようになりました。

公開されているソースリポジトリやチケットシステムなど様々な貢献の方法があり、すべてのボランティアが歓迎されます。Fabienがソースコードのリポジトリのメインコミッタを務めており、コードの品質維持を保証しています。

現在symfonyのフォーラム、メーリングリスト、チャット(IRC)が、だいたい1つの質問につき4つの回答がつくなど、理想的なサポート窓口となっています。毎日、新しい利用者がsymfonyをインストールし、wikiやコードの断片を共有するページではたくさんのユーザから寄稿されたドキュメントが載せられています。symfonyを用いたアプリケーションの数は1週間に5つの割合で増え続けています。

symfonyのコミュニティは、このフレームワークの3番目の強みとなっており、私たちはあなたがこの本を読んだ後にコミュニティに参加してくれることを願っています。

symfonyを使うべきか?

あなたがPHP5の達人であっても、またはウェブアプリケーションプログラミングの初心者であってもsymfonyを使用できます。symfonyを使うかどうかは、プロジェクトの規模の大きさによって決まります。

もし5~10ページ程度で、データベースへのアクセスが無く、ドキュメントの提出やパフォーマンスを保証する必要のないシンプルなウェブサイトを作るのであれば、PHPのみを用いた開発にこだわるべきです。そのような場合は、ウェブアプリケーションフレームワークや、オブジェクト指向プログラミングによる開発の恩恵を受けることはあまりないでしょう。MVCモデルは単に開発スピードを遅くすることになるかもしれません。ちなみにsymfonyはCGIモードでのみPHPスクリプトを動作させるような共有サーバで効率的に動作するよう最適化されていません。

これにひきかえ、もし重要なビジネスロジックを持つようなより複雑なウェブアプリケーションを開発する場合には、PHPだけでは役不足です。もしあなたがアプリケーションを将来にわたってメンテナンスしたり拡張するつもりなら、コードがより軽量で、効率的で、読み易いものであることが必要になるでしょう。もしAjaxのようなUIの最新の進化を、直感的に利用したいのであれば、何百行ものJavaScirpt?のコードを書くことは不可能です。もし楽しくさっさとアプリケーションを開発したいのに、PHPだけでそれを行うというのは、おそらくげんなりしてしまうことでしょう。こんなときにはsymfonyを使うべきです。

もちろん、あなたがウェブアプリケーション開発のプロであるなら、ウェブアプリケーションフレームワークから受ける恩恵はすでにご存知でしょう。そして完成されており、ドキュメントがたくさんあって、大規模なコミュニティをもつフレームワークが必要でしょう。もう探す必要はありません。symfonyがその答えです。

TIP
もし視覚的なドキュメントをお好みなら、symfonyのウェブサイトにあるスクリーンキャストをご覧ください。symfonyでのアプリケーション開発がどれだけ楽しく、すばやいものであるか見ることができるでしょう。

Fundamental Concepts

Before you get started with symfony, you should understand a few basic concepts. Feel free to skip ahead if you already know the meaning of OOP, ORM, RAD, DRY, KISS, TDD, YAML, and PEAR.

PHP 5

Symfony is developed in PHP 5 (http://www.php.net/) and dedicated to building web applications with the same language. Therefore, a solid understanding of PHP 5 is required to get the most out of the framework.

Developers who already know PHP 4 but not PHP 5 should mainly focus on the language's new object-oriented model.

Object-Oriented Programming (OOP)

Object-oriented programming (OOP) will not be explained in this chapter. It needs a whole book itself! Because symfony makes extensive use of the object-oriented mechanisms available as of PHP 5, OOP is a prerequisite to learning symfony.

Wikipedia explains OOP as follows:

The idea behind object-oriented programming is that a computer program may be seen as comprising a collection of individual units, or objects, that act on each other, as opposed to a traditional view in which a program may be seen as a collection of functions, or simply as a list of instructions to the computer.

PHP 5 implements the object-oriented paradigms of class, object, method, inheritance, and much more. Those who are not familiar with these concepts are advised to read the related PHP documentation, available at http://www.php.net/manual/en/language.oop5.basic.php.

Magic Methods

One of the strengths of PHP's object capabilities is the use of magic methods. These are methods that can be used to override the default behavior of classes without modifying the outside code. They make the PHP syntax less verbose and more extensible. They are easy to recognize, because the names of the magic methods start with two underscores (__).

For instance, when displaying an object, PHP implicitly looks for a __toString() method for this object to see if a custom display format was defined by the developer:

[php]
$myObject = new myClass();
echo $myObject;
// Will look for a magic method
echo $myObject->__toString();

Symfony uses magic methods, so you should have a thorough understanding of them. They are described in the PHP documentation (http://www.php.net/manual/en/language. oop5.magic.php).

PHP Extension and Application Repository (PEAR)

PEAR is "a framework and distribution system for reusable PHP components." PEAR allows you to download, install, upgrade, and uninstall PHP scripts. When using a PEAR package, you don't need to worry about where to put scripts, how to make them available, or how to extend the command-line interface (CLI).

PEAR is a community-driven project written in PHP and shipped with standard PHP distributions.

TIP The PEAR website, http://pear.php.net/, provides documentation and packages grouped by categories.

PEAR is the most professional way to install vendor libraries in PHP. Symfony advises the use of PEAR to keep a central installation point for use across multiple projects. The symfony plug-ins are PEAR packages with a special configuration. The symfony framework itself is available as a PEAR package.

You don't need to know all about the PEAR syntax to use symfony. You just need to understand what it does and have it installed. You can check that PEAR is installed in your computer by typing the following in a CLI:

> pear info pear

This command will return the version number of your PEAR installation.

The symfony project has its own PEAR repository, or channel. Note that channels are available only since version 1.4.0 of PEAR, so you should upgrade if your version is older. To upgrade your version of PEAR, issue the following command:

> pear upgrade PEAR

Object-Relational Mapping (ORM)

Databases are relational. PHP 5 and symfony are object-oriented. In order to access the database in an object-oriented way, an interface translating the object logic to the relational logic is required. This interface is called an object-relational mapping, or ORM.

An ORM is made up of objects that give access to data and keep business rules within themselves.

One benefit of an object/relational abstraction layer is that it prevents you from using a syntax that is specific to a given database. It automatically translates calls to the model objects to SQL queries optimized for the current database.

This means that switching to another database system in the middle of a project is easy. Imagine that you have to write a quick prototype for an application, but the client has not decided yet which database system would best suit his needs. You can start building your application with SQLite, for instance, and switch to MySQL, PostgreSQL, or Oracle when the client is ready to decide. Just change one line in a configuration file, and it works.

An abstraction layer encapsulates the data logic. The rest of the application does not need to know about the SQL queries, and the SQL that accesses the database is easy to find. Developers who specialize in database programming also know clearly where to go.

Using objects instead of records, and classes instead of tables, has another benefit: you can add new accessors to your tables. For instance, if you have a table called Client with two fields, FirstName and LastName, you might like to be able to require just a Name. In an object-oriented world, this is as easy as adding a new accessor method to the Client class, like this:

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;
}

And that's it. Imagine how long it would have required to write a SQL query doing the same thing!

Propel, another open source project, is currently one of the best object/relational abstraction layers for PHP 5. Symfony integrates Propel seamlessly into the framework, so most of the data manipulation described in this book follows the Propel syntax. This book will describe how to use the Propel objects, but for a more complete reference, a visit to the Propel website (http://propel.phpdb.org/trac/) is recommended.

Rapid Application Development (RAD)

Programming web applications has long been a tedious and slow job. Following the usual software engineering life cycles (like the one proposed by the Rational Unified Process, for instance), the development of web applications could not start before a complete set of requirements was written, a lot of Unified Modeling Language (UML) diagrams were drawn, and tons of preliminary documentation were produced. This was due to the general speed of development, to the lack of versatility of programming languages (you had to build, compile, restart, and who knows what else before actually seeing your program run), and most of all, to the fact that clients were quite reasonable and didn't change their minds constantly.

Today, business moves faster, and clients tend to constantly change their minds in the course of the project development. Of course, they expect the development team to adapt to their needs and modify the structure of an application quickly. Fortunately, the use of scripting languages like Perl and PHP makes it easy to apply other programming strategies, such as rapid application development (RAD) or agile software development.

One of the ideas of these methodologies is to start developing as soon as possible so that the client can review a working prototype and offer additional direction. Then the application gets built in an iterative process, releasing increasingly feature-rich versions in short development cycles.

The consequences for the developer are numerous. A developer doesn't need to think about the future when implementing a feature. The method used should be as simple and straightforward as possible. This is well illustrated by the maxim of the KISS principle: Keep It Simple, Stupid.

When the requirements evolve or when a feature is added, existing code usually has to be partly rewritten. This process is called refactoring, and happens a lot in the course of a web application development. Code is moved to other places according to its nature. Duplicated portions of code are refactored to a single place, thus applying the Don't Repeat Yourself (DRY) principle.

And to make sure that the application still runs when it changes constantly, it needs a full set of unit tests that can be automated. If well written, unit tests are a solid way to ensure that nothing is broken by adding or refactoring code. Some development methodologies even stipulate writing tests before coding--that's called test-driven development (TDD).

NOTE There are many other principles and good habits related to agile development. One of the most effective agile development methodologies is called Extreme Programming (abbreviated as XP), and the XP literature will teach you a lot about how to develop an application in a fast and effective way. A good starting place is the XP series books by Kent Beck (Addison-Wesley).

Symfony is the perfect tool for RAD. As a matter of fact, the framework was built by a web agency applying the RAD principle for its own projects. This means that learning to use symfony is not about learning a new language, but more about applying the right reflexes and the best judgment in order to build applications in a more effective way.

The symfony project website proposes a step-by-step tutorial illustrating the development of an application in an agile way. It is called askeet (http://www.symfony-project.com/askeet), and is recommended reading for those who want to learn more about agile development.

YAML

According to the official YAML website (http://www.yaml.org/), YAML is "a straightforward machine parsable data serialization format designed for human readability and interaction with scripting languages." Put another way, YAML is a very simple language used to describe data in an XML-like way but with a much simpler syntax. It is especially useful to describe data that can be translated into arrays and hashes, like this:

[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'
  )
);

This PHP array can be automatically created by parsing the YAML string:

house:
  family:
    name:     Doe
    parents:
      - John
      - Jane
    children:
      - Paul
      - Mark
      - Simone
  address:
    number: 34
    street: Main Street
    city: Nowheretown
    zipcode: 12345

In YAML, structure is shown through indentation, sequence items are denoted by a dash, and key/value pairs within a map are separated by a colon. YAML also has a shorthand syntax to describe the same structure with fewer lines, where arrays are explicitly shown with [] and hashes with {}. Therefore, the previous YAML data can be written in a shorter way, as follows:

house:
  family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
  address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 12345 }

YAML is an acronym for Yet Another Markup Language and pronounced "yamel." The format has been around since 2001, and YAML parsers exist for a large variety of languages.

TIP The specifications of the YAML format are available at http://www.yaml.org/.

As you can see, YAML is much faster to write than XML (no more closing tags or explicit quotes), and it is more powerful than .ini files (which don't support hierarchy). That is why symfony uses YAML as the preferred language to store configuration. You will see a lot of YAML files in this book, but it is so straightforward that you probably don't need to learn more about it.

Summary

Symfony is a PHP 5 web application framework. It adds a new layer on top of the PHP language, providing tools that speed up the development of complex web applications. This book will tell you all about it, and you just need to be familiar with the basic concepts of modern programming to understand it--namely object-oriented programming (OOP), object-relational mapping (ORM), and rapid application development (RAD). The only required technical background is knowledge of PHP 5.


目次