はじめに
本連載では、PHP上で動作するアプリケーションフレームワークである、symfonyでアプリケーション開発を行う方法について紹介します。前回までsymfonyによる掲示板アプリケーションの作成を通じて、scaffolding機能をはじめとしたデータベースとの連携や、ページャー機能やカスタムヘルパーの作成、入力値検証の方法、認証関連の機能、アドミンジェネレーターなどについて紹介してきました。今回は前回までで紹介しきれなかった機能を中心に解説していきます。具体的にはビュー断片化、ルーティング、キャッシュコントロールについて触れます。
過去の記事
- symfony入門(1):symfonyで始めるPHPフレームワーク
- symfony入門(2):掲示板アプリケーション作成でsymfonyを理解しよう(前篇)
- symfony入門(3):掲示板アプリケーション作成でsymfonyを理解しよう(後篇)
対象読者
PHPの基本構文は一通り理解しているが、フレームワークを利用したことはないという方を対象としています。
必要な環境
symfonyはPHP5とWebサーバがインストールされている環境で利用可能です。本連載ではWebサーバとしてApache 2.2を、OSにWindows XPを、データベースとしてMySQLを用いています。以下に、本連載でアプリケーション作成/動作確認に用いている環境を示します(インストールにあたっては最新安定版の使用を推奨します)。各項目の詳細なインストール手順は、「サーバサイド技術の学び舎 - WINGS」より 「サーバサイド環境構築設定手順」を参照ください。
- Window sXP SP2
- PHP 5.2
- PEAR
- Apache 2.2.3
- MySQL 5.0.24a
LinuxやFreeBSDなどUNIX系OSをお使いの方もコマンドはほぼ一緒ですので、パスなどは適宜読み替えてください。
symfony 1.0リリース
2月19日、symfony 1.0.0がリリースされました。前々回紹介した1.0.0-beta2からの変更点を簡単に訳したものを挙げておきます。
- Version 1.0.0
sfFilter::isFirstCall()
メソッドの修正DATABASE_NAME
定数を削除- Version 1.0.0-rc2
- propel-dump-dataタスク
- PEAR 1.5からのインストール問題の修正
- 新しいsymfony bookをdoc/へバンドル
- phpdocコメントをいくつか追加
- Version 1.0.0-rc1
- アドミンジェネレーターテンプレート継承の改善
- script.aculo.usを1.7.0へ、prototypeを1.5.0へアップデート
decorate_with()
ヘルパーの追加isForwardedTo()
メソッドをsfTestBrowser
へ追加- Windowsでのテストを修正
- phpdocコメントを更新
- Version 1.0.0-beta4
- アドミンジェネレーターにおける日付・時間ハンドリングの改善
- symfony初期化時のsfContext初期化を廃止
- sfBrowserにおけるSSLサポートを追加
- リッチテキストエディタのリファクタリング
- sfLogger設定のリファクタリング
- Creole i18nドライバの修正
- sfBrowserにおけるHTTP認証サポート追加
getPresentationFor()
をsfController
クラスへ移動- phpdocコメントを更新
- Version 1.0.0-beta3
- mailer.yml設定ファイルハンドリングの修正
- FastCGI互換性
include_javascripts()
とinclude_stylesheets()
の再導入tag
属性における値のエスケープを修正- アドミンジェネレーターへの「hide」パラメーターの追加
sfAction
へのsetViewClass()
メソッドの追加- requirements使用時のルート生成の修正
- PUT・DELETE・HEAD
HTTP
メソッドのサポート追加 - open_basedir使用時のsymfony CLIの修正
ビュー総括:レイアウトや断片化など(1/2)
symfonyでビューを扱うにあたって、これまでは主にテンプレートファイルとヘルパーを使用したアプリケーション作成を紹介してきました。symfonyにはこの他にも、ビューの作成を効率化・体系化するための仕組みがいろいろと用意されています。今回はここで、これらを総括してみましょう。
symfonyビュー各要素の組み合わせのイメージ
symfonyにおいては、ビューに以下の要素があります(括弧内は既出の回)。
要素 | 説明 |
テンプレート | アクションの結果が展開される場(第1回) |
レイアウト(layout.php) | 表示要素のレイアウト、すべてのページに適応される要素(第1回) |
view.yml | ビューの設定ファイル(第1回) |
responseオブジェクト | ビュー設定関連オブジェクト |
要素 | 説明 |
パーシャル | アクションを必要としないテンプレートの断片 |
コンポーネント | アクションを必要とするテンプレートの断片と、そのアクション |
コンポーネントスロット | 動的なコンポーネントと、その設定(view.yml内) |
スロット | アクションによる動的なレイアウト生成などに用いるテンプレートコード |
要素 | 説明 |
ヘルパー | symfonyの設定や特定のHTML要素を形にするPHPでできた部品(第1~3回) |
ショートカット | テンプレートにおいて必要な情報にアクセスするための変数(第2回) |
大まかには上記のように、ビューの大枠となるような要素、ビューの断片化を担う要素、テンプレートを構成するより具体的な要素に分けられます。
ここから、前回までで大きく扱わなかった各要素について解説していきます。
レイアウト:layout.php
レイアウトファイルは、テンプレートや設定ファイルなどがレイアウトを整えられて出てくる場です。ここで行えるのはその配置の管理や、出力する対象です。ここに書いたものは、原則すべてのページに反映されます(共通化されたビュー)。ここで第1回に示した「layout.php」を再掲します。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <?php echo include_http_metas() ?> (view.ymlのhttp_metas:の部分) <?php echo include_metas() ?> (view.ymlのmetas:の部分) <?php echo include_title() ?> (タイトル(アクションやview.ymlで設定可)) <link rel="shortcut icon" href="/favicon.ico" /> </head> <body> <?php echo $sf_data->getRaw('sf_content') ?> (ここに個々のテンプレートが反映される。sf_contentは アクションの結果を内容として持っている。$sf_dataコンテナ については前回コラム参照) </body> </html>
後述する「view.yml」の内容が<head>
タグ内に反映されているのは第1回で紹介した通りですが、このレイアウトファイル自体ももちろん、自由な形に仕上げる事ができます。例えば<body>
タグ内に次のように追記すれば、どのページにも表示されるヘッダー/フッターが出来上がるでしょう。
<body> <h5>WINGS PROJECT</h5> <?php echo $sf_data->getRaw('sf_content') ?> <i>Copyright(c) 2005-2007, Wings Project. All Right Reserved.</i> </body>
view.yml
レイアウトはあくまでレイアウトで、内容などに関してはこちらのファイルが設定を行っています。第1回で紹介した通り、レイアウトではinclude_***()
でこのファイルの設定を呼び出していました。ここでも第1回で示した内容を再掲します。
default:
http_metas: (http-metas設定部分。
「http-equiv:content」という書式)
content-type: text/html; charset=utf-8
metas: (metaタグの各部分。「name:content」という書式)
title: symfony project
robots: index, follow
description: symfony project
keywords: symfony, project
language: en
stylesheets: [main]
(スタイルシート読み込み。この場合
「<プロジェクトフォルダ>/web/css/main.css」が呼び出される)
javascripts: [ ] (Javascriptファイル読み込み)
has_layout: on (レイアウトファイルを使用)
layout: layout (レイアウトファイル名(拡張子省略))
ここでは最初の行の「default:」の通り、デフォルトでの設定を決めています。上記ファイルは「<アプリケーションフォルダ>/config」フォルダに存在します。このファイル、つまりアプリケーションレベルでの「view.yml」は、デフォルトの設定やヘッダー要素などを決めています。このデフォルトの要素を書き換えたり、その他モジュール別/テンプレート別の設定を行う場合には「<モジュールフォルダ>/config」フォルダ内に別個に「view.yml」を作成します。以下に実例を示します。
# view.yml mod1 index2Success: metas: title: インデックス-2 all: metas: title: サンプルアプリケーション
上記「index2Success」の項は、テンプレートファイル名(拡張子の前の部分)と一緒です。ここにテンプレートファイル名を指定する事で、テンプレート別の設定が可能になります。また「all:」はモジュール全体での設定です。以下にindex2アクションの実行結果を示します。
アクション内で行うビュー設定:Responseオブジェクト
上記「view.yml」ファイル内で行っている設定を、アクション内で行う事も可能です。それを実現するのがResponse
オブジェクト、「sfResponse」です。通常getResponse()
メソッドにより呼び出されます。以下に実例を示します(responseアクションとしています)。
public function executeResponse() { $response = $this->getResponse(); (オブジェクトの設定) $response->setTitle('Responseオブジェクト'); (タイトルを「Responseオブジェクト」に設定) }
上記の例では、アクション内でタイトルを設定しています。この他にもさまざまな設定がメソッドを通して可能になっています。以下、主なものを表にしておきます。
内容 | メソッド |
メタタグ設定1 | ->addHttpMeta('<HttpMeta要素名>', '<Meta パラメーター>'[, false(この指定で、パラメーターを上書きせず追加設定できる)]) |
メタタグ設定2 | ->addMeta('<Meta要素名>', '<Meta パラメーター>') |
ヘッダー情報取得 | ->getHttpHeader('<ヘッダー要素名>') |
タイトル設定 | ->setTitle(<タイトル文字列>) |
スタイルシート設定 | ->addStylesheet('<スタイルシート名(拡張子なし)>') |
Javascriptファイル設定 | ->addJavascript('Javascriptファイル名(拡張子なし)') |
レイアウト設定 | ->setLayout('<レイアウトファイル名(拡張子なし)。「false」でレイアウトなし>') |