ショートカット
第2回でも触れましたが、symfonyではテンプレート内で必要な情報にアクセスするためのショートカットが用意されています。以下に各ショートカットのメソッドの例を挙げておきます。
- $sf_context:contextオブジェクト全体(sfContextインスタンス)
- $sf_request:requestオブジェクト(sfRequestインスタンス)
- $sf_params:リクエストのパラメーター
- $sf_user:現在のユーザーセッションオブジェクト(sfUserインスタンス)
$sf_context->getActionName() アクション名を得る$sf_context->getModuleName() モジュール名を得る$sf_context->getModuleDirectory() モジュールフォルダを得る$sf_context->getRequest() sfRequestインスタンスを得る$sf_context->getResponse() sfResponseインスタンスを得る$sf_context->getUser() sfUserインスタンスを得る$sf_request->hasErrors() エラーが生じれば真$sf_request->getErrors() 生じたすべてのエラー内容の配列を得る$sf_request->getMethod() リクエストのメソッド(GETかPOSTか)を得る$sf_request->getParameter('a') パラメーター'a'の値を得る$sf_params->has('a') パラメーター'a'が存在すれば真$sf_params->get('a', 'default') パラメーター'a'の値を得る。得られなければ'default'を返す$sf_user->setCulture($culture) ユーザーの文化を$cultureに設定する$sf_user->getCulture() ユーザーの文化を得る$sf_user->getAttribute($name) ユーザーの属性を得る$sf_user->getParameter($name) ユーザーのパラメーターを得る $sf_requestや$sf_paramsは前回までで何回か使用しました。$sf_userは例えば前回紹介した認証管理などの際、テンプレートで$sf_user->getAttribute('nickname')などのように使用することができます。
$sf_contextは、フロントコントローラーで見る事ができるsfContext::getInstance()と等価です。例えば$sf_context->getRequest()のように、すべてのコアオブジェクトや現設定へアクセスすることができます。
ルーティング
ここからは、symfonyにおけるルーティングについて解説していきます。
symfonyにおけるルーティング
以前ルーティングについて、「routing.yml」を紹介しました。このファイルの設定によりさまざまなルーティングを実現することが可能となります。
routing.yml
では実際に、「rouitng.yml」について見ていきます。
# default rules
homepage:
url: /
param: { module: default, action: index }
default_symfony:
url: /symfony/:action/*
param: { module: default }
default_index:
url: /:module
param: { action: index }
default:
url: /:module/:action/*
基本的には下記のような形式になっています。
<ラベル>: url: <URL> param: <実際の呼び出しに必要とされるパラメーターのデフォルト指定> requirements: <パラメーターの正規表現による制約>
ラベルは、可読性とこれを利用することによるスピード確保のためにあり、リンクヘルパーによって利用することができます。
url:で用いられている「:<要素>」や「*」はワイルドカードです。「:<要素>」は任意の要素を示します。例えば「:action」は任意のアクション、「:id」は任意のId(クエリ情報。任意のキー名を指定可)です。「*」は任意の文字列です。
そして、これらのurlマッチは記述されている順に行われていきます。上記の例で「http://mysite/symfony/index」の「symfony」は、「default_symfony:」に(「default:」よりも)先にマッチするので、「default」モジュールが呼び出されます。
そうでなくとも例えば
/bbsdata/:id /bbsdata/:author
のようにマッチさせたいurl:がある場合、これらを分けるためにはrequirements:を用います。ここに正規表現を指定することで、うまく両者のパターンを振り分けることが可能となります。上記の場合は、
bbsdata_id:
url: /bbsdata/:id
param: { module: bbsdata, action: show }
requirements:
id: ^\d+$
bbsdata_author:
url: /bbsdata/:author
param; { module: bbsdata, action: list }
とすれば整数であるidは先に記述のある「bbsdata_id:」にマッチし、それ以外はその下の「bbsdata_author:」が適用されます。
param;の項では{パラメーター: デフォルト値, ...}のように、指定されない場合のパラメーター(モジュール名やidなど)のデフォルト値を指定していきます。
リンクヘルパーとの関連
先程のラベルに@をつけることで、リンクヘルパーで利用することができます。例えば
<?php echo link_to('Go to default page', '@default') ?>
は、上記の「rouitng.yml」の下では「default:」の項が適用され、
link_to('Go to default page', 'default/index')
と解釈されます(下図ステータスバー)。この方法を用いると、ルーティングがより高速になります。

.htmlを加えてみる
「routing.yml」ではないのですが、アプリケーションフォルダの「settings.yml」では、URLの末尾の形を決めることができます。
prod:
.settings
suffix: .html
この「suffix:」の項で末尾の形を決められます。例えば「http://localhost/mod2/index」は「http://localhost/mod2/index.html」となり、URLとしてより自然になります(下図)。

