Skip to content
Caution: You are browsing the legacy symfony 1.x part of this website.

1日目: プロジェクトを始める

Symfony version
Language
ORM

はじめに

symfonyフレームワークはオープンソースプロジェクトとして3年間以上開発され、すばらしい機能とドキュメントのおかげで今ではもっとも人気のあるフレームワークの1つになりました。

この本は仕様から実装まで段階的にWebアプリケーションをsymfonyで作る方法を説明します。 この本はsymfonyを学び、これがどのように動くのか理解し、またWeb開発のベストプラクティスも学びたい初心者をターゲットとしてします。

アプリケーションを別のblogエンジンにする選択肢もありました。 しかし私たちは実用上のプロジェクトでsymfonyを使うことを望んでいます。 ゴールはスタイルと少しの労力でプロフェッショナルなアプリケーションを開発するために使えることを実証することです。

今日はすでにたくさんのやることがあるので別の日のプロジェクトの内容は秘密にしておきます。 しかしながら、プロジェクトの名前を教えます: Jobeetです。

この本のそれぞれの章は1時間から2時間かけることを想定しており、 最初から最後まで実際のWebサイトのコーディングをすることでsymfonyを学ぶ機会になります。 毎日、新しい機能がアプリケーションに追加され、symfonyのWeb開発と同様に新しいsymfonyの機能を紹介するためにこの開発を利用します。

チャレンジ

チュートリアルの各章は約1時間ほどで終わる程度であり、実際のWebサイトを最初から最後までコーディングすることでsymfonyを学習します。

1日1時間24日で合計1日になります。 これはsymfonyの基本を学ぶために必要な時間であると私たちは考えています。 毎日、新しい機能がアプリケーションに追加され、symfonyのWeb開発のベストプラクティスと同時に新しい機能を紹介するためにこの開発プロセスを利用します。

askeetでは、21日目は「get-a-symfony-guru-for-a-day」でした。 私たちはノープランであり、コミュニティはaskeetに追加する要素を提案しなければなりませんでした。 21日目はすばらしい成功例であり、コミュニティはアプリケーションに検索エンジンを実装することが必要だと判断しました。 そして私たちは実装しました。 21日目のチュートリアルはaskeetチュートリアルの中でもっとも人気があります。

Jobeetでは、21日目に行われたデザインコンテストの優勝者を祝福しました。 優勝したデザインはcenter{source}によるもので、このチュートリアルのデフォルトのデザインとして使用しています。 また、実際のJobeetのWebサイトでもこのデザインが採用されています。

この本は一味違います

初期のころのPHP 4を覚えていますか? ベル・エポック(よき時代)でした。 PHPはWeb専用でもっとも習得しやすい最初の言語の1つでした。

しかし、Webテクノロジーは早く進化し、Web開発者は最新のベストプラクティスとツールについてゆくことが必要になりました。 学ぶための最良の方法はブログやチュートリアルや書籍を読むことです。 私たちはPHP、Python、Java、Ruby、Perlで書かれたたくさんの資料を読んできましたが、筆者がコードスニペットの例を提供するときにこれらの多くは不十分でした。

おそらく次のような注意書きを見たことがあるでしょう:

「実際のアプリケーションでは、バリデーションと適切なエラーハンドリングを追加するのを忘れないでください」

「読者の練習のため、セキュリティについては考慮していません」

「もちろんテストの記述は必要になります」

などです。

何ということでしょう。 これらは深刻な問題です。 これらはコードのもっとも重要な部分です。 それなのに読者は置き去りにされます。 これらの問題を考慮していないのであれば、サンプルコードは役に立ちませんし、よい出発点として使えません。 ひどいとは思いません? セキュリティやバリデーションやエラーハンドリングやテストは2・3の例を挙げると、きちんとコーディングしなければならないからです。

この本では、「テスト、エラーハンドリング、バリデーションコードは後で書きます」、「セキュアなアプリケーションを開発してください」といった文は見ることはいっさいありません。 なぜならsymfonyはコードそのものであり、企業向けのプロフェッショナルなアプリケーションを開発するためのベストプラクティスおよび手段でもあるからです。 symfonyは多くのコードを書かずにこれらの面を簡単に実装するために必要なすべてのツールを提供するのでこのような豪華なことができます。

symfonyではバリデーションやエラーハンドリング、セキュリティ、テストは第一級の扱いを受けます。 ですので説明にそれほどの時間はかかりません。 この点が「日常生活の」プロジェクトとしてフレームワークが使われる多くの理由の1つとなっています。

この本で読むすべてのコードは実際のプロジェクトで使えます。 コードのスニペットをコピー&ペーストするもしくはコード全体を流用することを推奨します。

プロジェクト

設計するアプリケーションを別のblogエンジンにすることもできました。 しかし私たちはsymfonyを実用的なプロジェクトとして使うことを望んでいます。 symfonyがスタイルと少しの労力でプロ仕様のアプリケーションの開発に使えることを実証するのがゴールです。

今日は多くの作業があるので別の日のプロジェクトのコンテンツは秘密にしておきます。 でもアプリケーションの名前はもうご存知ですよね?: Jobeetです。

今日は何を?

今日はPHPコードを書きません。 しかし1行もコードを書かないにしても新規プロジェクトをブートストラップすることでsymfonyのようなフレームワークを使うことの利点を理解し始めるでしょう。

この章の目標は開発環境のセットアップとWebブラウザーでアプリケーションのページを表示させることです。 これらはsymfonyのインストールとアプリケーションの作成、Webサーバーの設定も含まれます。

この本は主にsymfonyフレームワークに焦点を当てるので、PHP 5とオブジェクト指向のプログラミングのきちんとした知識があることを前提とします。

前提条件

symfonyをインストールする前に、すべてのソフトウェアがコンピューターにインストールされ正しく設定されているか確認する必要があります。 この章は入念に読み、コンフィギュレーションを確認するために必須のすべての手順に従ってください。 将来の時間を節約することになるでしょう。

サードパーティのソフトウェア

最初に、コンピューターにWeb開発にフレンドリーな作業環境があることを確認する必要があります。 最小要件として、Webサーバー(たとえばApache)、データベースエンジン(MySQL、PostgreSQL、SQLite、もしくはPDOと互換性のある任意のデータベースエンジン)、とバージョン5.2.4とそれ以降のPHPが必要です。

コマンドラインインターフェイス

symfonyフレームワークは多くの作業を自動化するコマンドツールを搭載しています。 Unix系OSのユーザーであるなら、快適に感じるでしょう。。 Windowsシステムを稼働させているのであれば、これまた立派に動きますが、cmdプロンプトでいくつかんコマンドを入力しなければなりません。

note

UnixシェルのコマンドはWindows環境で重宝します。 Windowsでtargzipもしくはgrepのようなツールを使いたいなら、Cygwinをインストールします。 冒険好きな人はMicrosoftのWindows Services for Unixを試すのもよいでしょう。

PHPのコンフィギュレーション

PHPのコンフィギュレーションはOSごと、Linuxディストリビューションごとでも異なるので、symfonyの最小要件を満たすことを確認する必要があります。

最初に、組み込みのphpinfo()関数を使うかコマンドラインでphp -vを実行するかによって少なくともPHP 5.2.4がインストールされていることを確認してください。 コンフィギュレーションによっては、1つはコマンドラインのために、もう1つはWebのために異なるバージョンのPHPをインストールすることが必要になることに注意してください。

それから、次のURLからsymfonyのコンフィギュレーションチェッカースクリプトをダウンロードします:

http://sf-to.org/1.3/check.php

スクリプトは現在のWeb公開ディレクトリのルートのどこかに保存してください。

コマンドラインからコンフィギュレーションチェッカースクリプトを立ち上げます:

$ php check_configuration.php

PHPのコンフィギュレーションに問題がある場合、コマンドの出力は何を修正しどのように直すのかのためのヒントを示します。

またブラウザーからチェッカーを実行し見つかる問題を修正します。 これは異なる設定を持つ2つの環境に対して異なるphp.ini設定ファイルがあるからです。

note

後でWeb公開のルートディレクトリのチェッカーを削除するのをお忘れなく。

symfonyのインストール

プロジェクトディレクトリを初期化する

symfonyをインストールする前に、最初にJobeetに関連するファイルをすべて格納するディレクトリを作る必要があります:

$ mkdir -p /home/sfprojects/jobeet
$ cd /home/sfprojects/jobeet

Windowsでは次の通りです:

c:\> mkdir c:\development\sfprojects\jobeet
c:\> cd c:\development\sfprojects\jobeet

note

Windowsユーザーの方はsymfonyの新しいプロジェクトをスペースが含まれないパスでセットアップすることをおすすめします。 My Documentsより下の場所を含めてDocuments and Settingsディレクトリを使うのは避けるべきです。

tip

symfonyのプロジェクトディレクトリをWeb公開のルートディレクトリで作るのであれば、Webサーバーのコンフィギュレーションを修正する必要はありません。
もちろん、運用環境では、Webサーバーのコンフィギュレーションのセクションで説明したように、サーバーのコンフィギュレーションを修正する必要があります。

symfonyのバージョンを選ぶ

では、symfonyをインストールします。 symfonyフレームワークにはいくつかの安定バージョンがあるので、symfonyの公式サイトのインストールの手引きのページを読んでインストールしたいバージョンを選ぶ必要があります。

この本ではsymfony 1.3もしくはsymfony 1.4をインストールすることを想定しています。

symfonyのインストール位置を選ぶ

symfonyをグローバルで利用できるようにインストールする、もしくはそれぞれのプロジェクトごとに組み込むことができます。 それぞれのプロジェクトは全体的に独立しているので後者がおすすめです。 ローカルでアップグレードすればインストールしたsymfonyが意図せずにいくつかのプロジェクトを壊すことはありません。 これは異なるバージョンのsymfonyで複数のプロジェクトを持ち、これらを1つづ適切にアップグレードできることを意味します。

ベストプラクティスとして、多くの人がsymfonyフレームワークをプロジェクトのlib/vendorディレクトリにインストールします。ですので、最初にこのディレクトリを作ります:

$ mkdir -p lib/vendor

symfonyをインストールする

アーカイブからインストールする

symfonyをインストールするもっとも簡単な方法はsymfonyのWebサイトからバージョンを選んだバージョンのアーカイブをダウンロードすることです。 選んだバージョン、たとえばsymfony 1.4のインストールページに移動します。

"Source Download"のセクションの下で、.tgzもしくは.zipフォーマットのアーカイブが見つかります。 アーカイブをダウンロードし、新たに作られたlib/vendor/ディレクトリの下に置き、展開し、ディレクトリの名前をsymfonyに変更します:

$ cd lib/vendor
$ tar zxpf symfony-1.4.0.tgz
$ mv symfony-1.4.0 symfony
$ rm symfony-1.4.0.tgz

Windows環境ではzipファイルの展開はエクスプローラーで行います。 ディレクトリの名前をsymfonyに変更すると、c:\dev\sfprojects\jobeet\lib\vendor\symfonyのような構造になります。

Subversionからインストールする(推奨)

Subversionを使うのであれば、プロジェクトのlib/vendor/ディレクトリに組み込むためにsvn:externalsを使うのがよいです:

$ svn pe svn:externals lib/vendor/

note

プロジェクトを新しいSubversionリポジトリにインポートする方法はこの章の最後で説明します。

すべてがうまくいっているのであれば、このコマンドはSubversionの外部ソースを設定する機会を提供する好みのエディターを走らせます。

tip

Windowsでは、コンソールを使わずにすべての作業ができるTortoiseSVNのようなツールを使うことができます。

慎重に利用するのであれば、プロジェクトを特定のリリースに結びつけます(subversionタグ):

symfony http://svn.symfony-project.com/tags/RELEASE_1_3_0

新しいリリースが公開されるときに(symfonyの公式 blogでアナウンスされるたびに)、URLを新しいバージョンに変更する必要があります。

開発最先端のIf you want to go the bleeding-edge route、1.4ブランチを使います:

symfony http://svn.symfony-project.com/branches/1.4/

Using the branch makes your project benefits from the bug fixes automatically whenever you run a svn update.

Installation Verification

Now that symfony is installed, check that everything is working by using the symfony command line to display the symfony version (note the capital V):

$ cd ../..
$ php lib/vendor/symfony/data/bin/symfony -V

On Windows:

c:\> cd ..\..
c:\> php lib\vendor\symfony\data\bin\symfony -V

The -V option also displays the path to the symfony installation directory, which is stored in config/ProjectConfiguration.class.php.

If the path to symfony is an absolute one (which should not be by default if you follow the above instructions), change it so it reads like follows for better portability:

// config/ProjectConfiguration.class.php
require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';

That way, you can move the project directory anywhere on your machine or another one, and it will just work.

tip

If you are curious about what this command line tool can do for you, type symfony to list the available options and tasks:

$ php lib/vendor/symfony/data/bin/symfony

On Windows:

c:\> php lib\vendor\symfony\data\bin\symfony

The symfony command line is the developer's best friend. It provides a lot of utilities that improve your productivity for day-to-day activities like cleaning the cache, generating code, and much more.

プロジェクトのセットアップ

In symfony, applications sharing the same data model are regrouped into projects. For most projects, you will have two different applications: a frontend and a backend.

プロジェクトの作成

From the sfprojects/jobeet directory, run the symfony generate:project task to actually create the symfony project:

$ php lib/vendor/symfony/data/bin/symfony generate:project jobeet --orm=Propel

On Windows:

c:\> php lib\vendor\symfony\data\bin\symfony generate:project jobeet --orm=Propel

The generate:project task generates the default structure of directories and files needed for a symfony project:

ディレクトリ 説明
apps/ プロジェクトのすべてのアプリケーションを格納する
cache/ フレームワークによってキャッシュされるファイル
config/ プロジェクトの設定ファイル
lib/ プロジェクトのライブラリとクラス
log/ フレームワークのログファイル
plugins/ インストールされたプラグイン
test/ ユニットテストと機能テストのファイル
web/ Web公開ルートディレクトリ(下記を参照)

note

なぜsymfonyはたくさんのファイルを生成するのでしょうか? フルスタックフレームワークを使う主な利点の1つは開発作業を標準化することです。 symfonyのファイルとディレクトリのデフォルト構造のおかげで、ある程度の知識がある開発者はsymfonyプロジェクトのメンテナンスを引き継ぎできます。 ほんの数分で、引き継ぎ者はコードに飛び込むことが可能で、バグを修正し新しい機能を追加します。

タスクを実行するときに入力しなければならない文字数を短くするためにでgenerate:projectタスクはsymfonyのショートカットをJobeetプロジェクトのルートディレクトリに作りました。

これからは、symfonyプログラムへのフルパスの代わりにsymfonyショートカットを使います。

アプリケーションの作成

今度はgenerate:appタスクを実行してfrontendアプリケーションを生成します。

$ symfony generate:app frontend

tip

symfonyファイルが実行可能なので、Unixのユーザーはすべての'php symfony'を'./symfony'に置き換えできます。 Windowsでは'symfony.bat'ファイルをプロジェクトにコピーして'php symfony'の代わりに'symfony'コマンドが使えます:

c:\> copy lib\vendor\symfony\data\bin\symfony.bat .

プロジェクト生成と同じように、generate:appタスクはアプリケーションに必要なディレクトリをapps/frontend/ディレクトリ以下で生成します。

ディレクトリ 説明
config/ アプリケーションの設定ファイル
lib/ アプリケーションのライブラリとクラス
modules/ アプリケーションのコード(MVC)
templates/ グローバルテンプレートファイル

sidebar

セキュリティ

By default, the generate:app task has secured our application from the two most widespread vulnerabilities found on the web. That's right, symfony automatically takes security measures on our behalf.

To prevent XSS attacks, output escaping has been enabled; and to prevent CSRF attacks, a random CSRF secret has been generated.

Of course, you can tweak these settings thanks to the following options:

  • --escaping-strategy: Enables or disables output escaping
  • --csrf-secret: Enables session tokens in forms

XSSもしくはCSRFに関して何も知らなければ、これらの脆弱性について学ぶ時間を割いてください。

ディレクトリ構造の権限

Before trying to access your newly created project, you need to set the write permissions on the cache/ and log/ directories to the appropriate levels, so that your web server can write to them:

$ chmod 777 cache/ log/

sidebar

SCMツールを使う方のための豆知識

symfony only ever writes in two directories of a symfony project, cache/ and log/. The content of these directories should be ignored by your SCM (by editing the svn:ignore property if you use Subversion for instance).

Webサーバーのコンフィギュレーション:好ましくないやり方

If you have created the project directory it somewhere under the web root directory of your web server, you can already access the project in a web browser.

もちろん設定ファイルを編集しないので、迅速なセットアップができますが、config/database.ymlにブラウザーから直接アクセスできるので手抜きの悪い結果を見ることになります。 Webサイトがsymfonyで開発されたことをユーザーが知っていたら、たくさんのデリケートなファイルにアクセスが可能となってしまします。

**運用サーバーでこのセットアップ方法は絶対に実行してはなりません。 **次の節を読んでWebサーバーの適切な設定方法を学んでください。

Webサーバーのセットアップ:セキュアな方法

Web開発のよい習慣はスタイルシート、JavaScript、もしくは画像のようなWebブラウザーがアクセスする必要のあるファイルだけをWebのルートディレクトリの下に設置することです。 デフォルトでは、symfonyプロジェクトのwebサブディレクトリにこれらのファイルを保存することをおすすめします。

If you have a look at this directory, you will find some sub-directories for web assets (css/ and images/) and the two front controller files. The front controllers are the only PHP files that need to be under the web root directory. All other PHP files can be hidden from the browser, which is a good idea as far as security is concerned.

Webサーバーのコンフィギュレーション

世界中から新しいプロジェクトにアクセスできるようにApacheのコンフィギュレーションを変更しましょう。

httpd.conf設定ファイルを見つけて開き次のコンフィギュレーションを最後の行を追加します:

# Be sure to only have this line once in your configuration
NameVirtualHost 127.0.0.1:8080

# This is the configuration for your project
Listen 127.0.0.1:8080

<VirtualHost 127.0.0.1:8080>
  DocumentRoot "/home/sfprojects/jobeet/web"
  DirectoryIndex index.php
  <Directory "/home/sfprojects/jobeet/web">
    AllowOverride All
    Allow from All
  </Directory>

  Alias /sf /home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf
  <Directory "/home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>

note

/sf エイリアス gives you access to images and javascript files needed to properly display default symfony pages and the web debug toolbar|Web Debug Toolbar.

On Windows, you need to replace the Alias line with something like:

Alias /sf "c:\dev\sfprojects\jobeet\lib\vendor\symfony\data\web\sf"

And /home/sfprojects/jobeet/web should be replaced with:

c:\dev\sfprojects\jobeet\web

この設定によってApacheはマシンのポート番号8080をリスニングするようになるので、Webサイトは次のURLからアクセスできるようになります:

http://~localhost~:8080/

8080以外の好きな番号に変更できますが管理者権限を必要としない1024よりも大きな番号が望ましいです。

sidebar

ドメイン名を設定する

マシンの管理者であるなら、新しいプロジェクトを始めるたびに新しいポート番号を追加する代わりにバーチャルホストをセットアップするほうがよいです。 ポート番号を選ぶ代わりにListenステートメントを追加し、ドメイン名を選びServerNameステートメントを追加します:

# This is the configuration for Jobeet
<VirtualHost 127.0.0.1:80>
  ServerName jobeet.localhost
  <!-- same configuration as before -->
</VirtualHost>

ドメイン名のjobeet.localhostはローカルで宣言されなければなりません。 Linuxシステムを稼働させているのであれば、/etc/hostsファイルで行わなければなりません。 Windows XPを稼働させているのであれば、このファイルはC:\WINDOWS\system32\drivers\etc\ディレクトリの中で見つかります。

次の行を追加します:

127.0.0.1         jobeet.localhost

新しい設定をテストする

Apacheを再起動し、ブラウザーを開きhttp://localhost:8080/index.php/もしくはhttp://jobeet.localhost/index.php/を入力することで新しいアプリケーションにアクセスできるか確認します。 どちらのURLになるかは以前のセクションで選んだ設定によります。

初期ページ

note

Apacheのmod_rewriteモジュールをインストールした場合、URLのindex.php/部分を取り除くことができます。 これはweb/~.htaccess|.htaccess(Apache)~ファイルで設定される書き換えルールのおかげで可能です。

開発環境のアプリケーションにもアクセスしてみることにします。 次のURLを入力します:

http://jobeet.localhost/frontend_dev.php/

Webデバッグツールバーは右上コーナーに表示され、小さなアイコンが含まれていればsf/エイリアスの設定が正しいことがわかります。

Webデバッグツールバー

Webデバッグツールバーは 開発環境のすべてのページに存在し異なるタブにクリックすれば多くの情報: 現在のアプリケーションの設定、現在のリクエストのログ、データベースエンジンで実行されたSQLステートメント、メモリ情報、時間の情報が得られます。

note

Windows環境のIISサーバーでsymfonyを動かしたい場合セットアップ方法が少し異なります。 関連チュートリアルで設定する方法がわかります。

Subversion

Webアプリケーションを開発するときにバージョン管理ツールを利用するのはよい習慣です。 バージョン管理ツールを利用することで次のことが可能になります:

  • 安心して作業する
  • 変更によって何かが壊れたときに以前のバージョンに差し戻す
  • プロジェクトで複数の人が効率的に作業できる
  • 連続するすべてのバージョンのアプリケーションを入手できる

この節では、Subversionの使い方を説明します。 別のソースコード管理ツールを利用しているのであれば、私たちがSubversionについて説明することを適用するのは簡単でしょう。

Subversionサーバーへの権限がありHTTPを通してアクセスできることを前提とします。

tip

自由に使えるSubversionサーバーがなければ、無料のGoogle Codeで作成するかより多くの選択肢を探すためにGoogle検索で"free subversion repository"を入力して検索します。

最初に、リポジトリサーバーでjobeetプロジェクト用のリポジトリを作ります:

$ svnadmin create /path/to/jobeet/repository

マシンの上で、ディレクトリの基本構造を作成します:

$ svn mkdir -m "created default directory structure" http://svn.example.com/jobeet/trunk http://svn.example.com/jobeet/tags http://svn.example.com/jobeet/branches

そして空のtrunk/ディレクトリをチェックアウトします:

$ cd /home/sfprojects/jobeet
$ svn co http://svn.example.com/jobeet/trunk/ .

それから、cache/log/ディレクトリをリポジトリに置きたくないのでこれらの内容を削除します。

$ rm -rf cache/* log/*

Webサーバーが書き込みできるようにcacheとlogディレクトリに適切なレベルの書き込み権限をかならず設定してください:

$ chmod 777 cache/ log/

すべてのファイルとディレクトリをインポートします:

$ svn add *

cache//logディレクトリに設定されたファイルをコミットしたくないので、無視リストを指定する必要があります:

$ svn propedit svn:ignore cache

SVN用に設定されたデフォルトのテキストエディターが起動します。 Subversionはこのディレクトリのすべての内容を無視しなければなりません:

*

保存して終了します。終わりました。

log/ディレクトリ用に手順を繰り返します:

$ svn propedit svn:ignore log

そして次のコマンドを入力します:

*

最後に、これらの変更をレポジトリにコミットします:

$ svn import -m "made the initial import" . http://svn.example.com/jobeet/trunk

tip

WindowsユーザーはSubvresionのレポジトリを管理するためにすばらしい TortoiseSVN クライアントを利用できます。

note

JobeetのSVNレポジトリは毎日公開されます。

リポジトリは(http://svn.jobeet.org/)はまだ公開されていませんが、今日のコードはコミットされタグづけされました。

release_day_01をチェックアウトできます:

  $ svn co http://svn.jobeet.org/tags/release_day_01/ jobeet/

それではまた明日

はい、今日はここまでです! symfonyについてまだ何も話していませんが、確固とした開発環境をセットアップし、Web開発のベストプラクティスを話し、コーディングを始める準備ができています。

明日は、アプリケーションが何を行うのかを明らかにしJobeetのために実装する必要のある要件を話します。

note

今日もしく他の日のコードを確認したい場合、Jobeetの公式SVNリポジトリから一日分の内容ごとに入手可能です(http://svn.jobeet.org/propel/)。

たとえば、release_day_01タグをチェックアウトすれば今日のコードを入手できます:

  $ svn co http://svn.jobeet.org/propel/tags/release_day_01/ jobeet/

This work is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License license.