Symfony2 の全体像 | Symfony2日本語ドキュメント
http://docs.symfony.gr.jp/symfony2/quick_tour/the_big_picture.html
1. 全体像
さあ、10 分で Symfony2 を使いこなしましょう! 本チュートリアルでは、Symfony2 のもっとも重要な概念を段階的に説明します。 それでは、サンプルプロジェクトの構造を見ながら、すばやく開始しましょう。
これまでに何らかの Web フレームワークを使ったことがあるなら、Symfony2 には苦労しないはずです。 もしまだなら、まったく新しい Web アプリケーション開発方法へようこそ!
1.1. Symfony2 のダウンロードとインストール
まずは、Web サーバ (Apache など) をインストールし、PHP 5.3.2 以降が動作するように設定しているかどうかを確認します。
用意できましたか? では、Symfony2 をダウンロードしましょう。 今すぐ始めるには、「Symfony2 sandbox」(訳注: sandbox は OBSOLETE CODE となり、代わりに Standard Edition の使用が推奨されています。ただし、クイックツアーの第1部では sandbox の内容が元になっているため、ところどころ記述が合わない部分があります。注意してください。) を使います。 これは、単純なコントローラと動作に必要なライブラリが含まれている、設定済みの Symfony2 プロジェクトになります。 sandbox の大きな利点は、他のインストール方法に比べ、即座に Symfony2 で検証作業を開始できることにあります。
sandbox をダウンロードし、Web の root ディレクトリ (訳注: ドキュメントルートのこと) に展開します。 これで、sandbox/ ディレクトリができるはずです:
www/ <- Web の root ディレクトリ sandbox/ <- 展開されたアーカイブ app/ cache/ config/ logs/ src/ Sensio/ HelloBundle/ Controller/ Resources/ vendor/ symfony/ doctrine/ ... web/
1.2. 設定の確認
Symfony2 では、Web サーバや PHP の設定ミスから生じる問題を回避するのに役立つ、仮想サーバの構成テスターが付属しています。 サーバの診断を参照するには、次の URL を使います:
http://localhost/sandbox/web/check.php
check.php スクリプトの出力を注意深く読み、未解決の問題をすべて修正してください。
これで、Symfony2 の「本当の」Web ページを、初めてリクエストできます:
http://localhost/sandbox/web/app_dev.php/
Symfony2 は、ここまで大変な作業をしてきたあなたに感謝してくれます!
1.3. 初めてのアプリケーション作成
sandbox には、簡単な Hello World 「アプリケーション」が同梱されており、Symfony2 を詳しく学ぶために用います。 Symfony2 によって生成された次の URL にアクセスしてみてください (Fabien をあなたの名前に置き換えて):
http://localhost/sandbox/web/app_dev.php/hello/Fabien
ここでは一体何が起きているのでしょうか? URL を分解してみましょう:
- app_dev.php: これは「フロントコントローラ(front controller)」です。 フロントコントローラは、アプリケーションの唯一のエントリーポイントであり、ユーザのリクエストのすべてに応答します。
- /hello/Fabien: これはユーザがアクセスしたいリソースへのバーチャルパス(virtual path)です。
開発者がすべきことは、ユーザのリクエスト (/hello/Fabien) を、関連するリソース (Hello Fabien!) に対応付けるためのコードを記述することになります。
1.3.1. 設定
Symfony2 設定ファイルは、PHP や XML または YAML で記述することができます。 さまざまな種類と互換性があり、アプリケーションではそれぞれ同等に使用できます。
1.3.2. ルーティング
Symfony2 は、ルーティング設定ファイルを用いて、あなたのコードにリクエストを配送しています。 アプリケーション用のルーティング設定ファイルの例を以下に示します:
# app/config/routing.yml homepage: pattern: / defaults: { _controller: FrameworkBundle:Default:index } hello: resource: "@HelloBundle/Resources/config/routing.yml"
<!-- app/config/routing.xml --> <?xml version="1.0" encoding="UTF-8" ?> <routes xmlns="http://www.symfony-project.org/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.symfony-project.org/schema/routing http://www.symfony-project.org/schema/routing/routing-1.0.xsd"> <route id="homepage" pattern="/"> <default key="_controller">FrameworkBundle:Default:index</default> </route> <import resource="@HelloBundle/Resources/config/routing.xml" /> </routes>
// app/config/routing.php use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Route; $collection = new RouteCollection(); $collection->add('homepage', new Route('/', array( '_controller' => 'FrameworkBundle:Default:index', ))); $collection->addCollection($loader->import("@HelloBundle/Resources/config/routing.php")); return $collection;
ルーティング設定ファイルの最初の数行では、パターンを指定した「/」リソース (すなわち、ホームページ) を、ユーザがリクエストするときに実行されるコードを定義しています。 ここでは、FrameworkBundle 内の Default コントローラの index メソッドを実行します。(訳注: sandbox の PR6 時点の情報です。PR7 では DefaultController.php はなくなりました。また、app/config/routing.php の記載内容も変更されています。)
次に、その設定ファイルの最後のディレクティブを見てください: Symfony2 では、import ディレクティブを用いて、別のルーティング設定ファイルから、ルーティング情報をインクルードすることができます。(訳注: YAML でいうところの、import ディレクティブは、「resource: "@~"」部分になります。) この例では、HelloBundle からルーティング設定をインポートしています。 バンドルとはプラグインを強力にしたようなものです。後で詳しく説明します。 とりあえず、インポートしたルーティング設定の内容を見てみましょう:
# src/Sensio/HelloBundle/Resources/config/routing.yml hello: pattern: /hello/{name} defaults: { _controller: HelloBundle:Hello:index }
<!-- src/Sensio/HelloBundle/Resources/config/routing.xml --> <?xml version="1.0" encoding="UTF-8" ?> <routes xmlns="http://www.symfony-project.org/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.symfony-project.org/schema/routing http://www.symfony-project.org/schema/routing/routing-1.0.xsd"> <route id="hello" pattern="/hello/{name}"> <default key="_controller">HelloBundle:Hello:index</default> </route> </routes>
// src/Sensio/HelloBundle/Resources/config/routing.php use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Route; $collection = new RouteCollection(); $collection->add('hello', new Route('/hello/{name}', array( '_controller' => 'HelloBundle:Hello:index', ))); return $collection;
ご覧のように、「/hello/{name}」リソースのパターンは、_controller 設定値によって参照されるコントローラに対応付けられています。 波括弧で囲まれた文字列 ({name}) は、プレースホルダーであり、コントローラで利用可能な引数を定義しています。
1.3.3. コントローラ
コントローラでは、ユーザのリクエストを処理するアクションを定義し、レスポンス (大体は、HTML 形式) を準備します。
// src/Sensio/HelloBundle/Controller/HelloController.php namespace Sensio\HelloBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class HelloController extends Controller { public function indexAction($name) { return $this->render('HelloBundle:Hello:index.html.twig', array('name' => $name)); // 代わりに PHP テンプレートでレンダーリングする // return $this->render('HelloBundle:Hello:index.html.php', array('name' => $name)); } }
このコードは結構簡単ですが、行を追って説明しましょう。
- line 3: Symfony2 では PHP 5.3 の新機能である名前空間を利用して、すべてのコントローラに、適切に名前空間を割り当てる必要があります。 見てわかるように、名前空間には実際のファイルの場所との相関関係があります。 この例では、ルーティングの _controller 設定値の最初の部分で形成した HelloBundle という名前のバンドルの中にコントローラがあります。
- line 7: コントローラ名は、ルーティングの _controller 設定値の 2 番目の部分 (Hello) と単語 Controller を組み合わせたものにします。 (このチュートリアルの後半にでてくるように) 便利なショートカットを提供する、組込みの Controller クラスを拡張します。 Controller は、5 行目で定義した Symfony\Bundle\FrameworkBundle\Controller\Controller に属しています。
- line 9: コントローラはそれぞれ、数個のアクションで構成されます。 ハローページはルーティング設定の通りに、index アクション (ルーティングの _controller 設定値の 3 番目の部分) によって処理されます。 このメソッドは引数に、プレースホルダー設定値 (この場合は $name) を取ります。
- line 11: render() メソッドは、テンプレートファイル (HelloBundle:Hello:index.html.twig) をロードして、第 2 引数に渡された変数でレンダーリングします。 この例では、テンプレートは、src\Sensio\HelloBundle\Resources\views\Hello\index.html.twig ファイルに相当します。
では、バンドルとは何でしょう? Symfony2 プロジェクトで書くコードはすべて、バンドルで構成されています。 Symfony2 でいうところの、バンドルとは、単一機能 (ブログ、フォーラム、…) が実装されているファイルの集合体 (PHP ファイル、スタイルシート、JavaScript、イメージ、…) であり、他の開発者と簡単に共有することができるもののことです。 この例では、バンドルは 1 つ (HelloBundle) だけあります。
1.3.4. テンプレート
コントローラは HelloBundle:Hello:index.html.twig テンプレートをレンダーリングします。 デフォルトでは、sandbox は Symfony2 のテンプレートエンジンに Twig を用いますが、従来の PHP テンプレートも選択すれば使うことができます:
{# src/Sensio/HelloBundle/Resources/views/Hello/index.html.twig #} {% extends "HelloBundle::layout.html.twig" %} {% block content %} Hello {{ name }}! {% endblock %}
おめでとう!ここまで、Symfony2 のコードを用いたページの作成を体験してきました。 そんなに難しくありませんでしたね? まだまだたくさん学ぶことがありますが、Symfony2 によって、実に簡単により良い Web サイトをすばやく実装できることがわかったと思います。
1.4. 作業環境
Symfony2 がどのように動作しているのかについて理解を深めたら、今度はページの一番下をよく見てください。 すると、Symfony2 ロゴと PHP ロゴの入った小さなバーに気づくでしょう。 これは「Web デバッグツールバー (Web Debug Toolbar)」と呼ばれるもので、開発者の強い味方になります。 もちろん、そのようなツールは、本番環境にアプリケーションをデプロイするときには、表示してはいけません。 だから、web/ ディレクトリに本番環境に最適化している別のフロントコントローラ (app.php) があるのです。
http://localhost/sandbox/web/app.php/hello/Fabien
また、mod_rewrite を有効にしてある Apache を使っているなら、URL の app.php 部分を省略することもできます。
http://localhost/sandbox/web/hello/Fabien
大事なことをひとつ言い残しましたが、本番サーバでは、設定をセキュアにするため、Web の root ディレクトリを web/ ディレクトリに合わし、さらに、より見栄えのいい URL にしなければなりません:
http://localhost/hello/Fabien
可能な限り速い本番環境を作るため、Symfony2 は app/cache/ ディレクトリ内にキャッシュを保持します。 コードまたはコンフィギュレーションを変更する場合は、キャッシュされたファイルを手動で削除する必要があります。 アプリケーションを開発する際は、キャッシュを使わない開発用フロントコントローラ (app_dev.php) を使用する必要があります。 開発用フロントコントローラを使えば、変更がすぐに反映されます。
1.5. 最後に
Symfony2 を試してくれてありがとう! 今では、自分で簡単なルーティング、コントローラ、およびテンプレートを作成できるはずです。 練習に、Hello アプリケーションよりも役に立つものを作ってみてください! Symfony2 についてもっと詳しく学びたいのなら、次の章「ビュー」に進んでください。
翻訳元:
[quick_tour][big_picture] Fixing up some spacing and a few minor changes - 2011-03-08 19:27:38
https://github.com/symfony/symfony-docs/blob/master/quick_tour/the_big_picture.rst
0 コメント:
コメントを投稿