Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

symfony入門(4):symfonyプログラミング 開発のテクニック(前篇)

symfonyによる実践的なPHPアプリケーション開発

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/03/09 00:00

PHPのアプリケーションフレームワーク「symfony」による、アプリケーション開発を解説した連載第4回です。今回は「ビュー断片化」「ルーティング」「キャッシュコントロール」について触れます。

目次

はじめに

 本連載では、PHP上で動作するアプリケーションフレームワークである、symfonyでアプリケーション開発を行う方法について紹介します。前回までsymfonyによる掲示板アプリケーションの作成を通じて、scaffolding機能をはじめとしたデータベースとの連携や、ページャー機能やカスタムヘルパーの作成、入力値検証の方法、認証関連の機能、アドミンジェネレーターなどについて紹介してきました。今回は前回までで紹介しきれなかった機能を中心に解説していきます。具体的にはビュー断片化、ルーティング、キャッシュコントロールについて触れます。

過去の記事

対象読者

 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・HEADHTTPメソッドのサポート追加
    • 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」を再掲します。

templates/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>タグ内に次のように追記すれば、どのページにも表示されるヘッダー/フッターが出来上がるでしょう。

layout.php(抜粋)
<body>
<h5>WINGS PROJECT</h5>
<?php echo $sf_data->getRaw('sf_content') ?>
<i>Copyright(c) 2005-2007, Wings Project.
  All Right Reserved.</i>
</body>
layout.phpに追記したヘッダー/フッター
layout.phpに追記したヘッダー/フッター

view.yml

 レイアウトはあくまでレイアウトで、内容などに関してはこちらのファイルが設定を行っています。第1回で紹介した通り、レイアウトではinclude_***()でこのファイルの設定を呼び出していました。ここでも第1回で示した内容を再掲します。

conifig/view.yml
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
# view.yml mod1
index2Success:
  metas:
    title: インデックス-2

all:
  metas:
    title: サンプルアプリケーション

 上記「index2Success」の項は、テンプレートファイル名(拡張子の前の部分)と一緒です。ここにテンプレートファイル名を指定する事で、テンプレート別の設定が可能になります。また「all:」はモジュール全体での設定です。以下にindex2アクションの実行結果を示します。

view.yml編集によるタイトル設定
view.yml編集によるタイトル設定

アクション内で行うビュー設定:Responseオブジェクト

 上記「view.yml」ファイル内で行っている設定を、アクション内で行う事も可能です。それを実現するのがResponseオブジェクト、「sfResponse」です。通常getResponse()メソッドにより呼び出されます。以下に実例を示します(responseアクションとしています)。

actions.class.php(抜粋)
  public function executeResponse()
  {
    $response = $this->getResponse();  (オブジェクトの設定)
    $response->setTitle('Responseオブジェクト');
      (タイトルを「Responseオブジェクト」に設定)
  }
Responseオブジェクトによるタイトル設定
Responseオブジェクトによるタイトル設定

 上記の例では、アクション内でタイトルを設定しています。この他にもさまざまな設定がメソッドを通して可能になっています。以下、主なものを表にしておきます。

Responseオブジェクトメソッド
内容メソッド
メタタグ設定1->addHttpMeta('<HttpMeta要素名>', '<Metaパラメーター>'[, false(この指定で、パラメーターを上書きせず追加設定できる)])
メタタグ設定2->addMeta('<Meta要素名>', '<Metaパラメーター>')
ヘッダー情報取得->getHttpHeader('<ヘッダー要素名>')
タイトル設定->setTitle(<タイトル文字列>)
スタイルシート設定->addStylesheet('<スタイルシート名(拡張子なし)>')
Javascriptファイル設定->addJavascript('Javascriptファイル名(拡張子なし)')
レイアウト設定->setLayout('<レイアウトファイル名(拡張子なし)。「false」でレイアウトなし>')

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 川北 季(カワキタ ミノル)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:symfony入門
All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5