SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

symfony入門

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

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


ショートカット

 第2回でも触れましたが、symfonyではテンプレート内で必要な情報にアクセスするためのショートカットが用意されています。以下に各ショートカットのメソッドの例を挙げておきます。

  • $sf_context:contextオブジェクト全体(sfContextインスタンス)
    • $sf_context->getActionName() アクション名を得る
      $sf_context->getModuleName() モジュール名を得る
      $sf_context->getModuleDirectory() モジュールフォルダを得る
      $sf_context->getRequest() sfRequestインスタンスを得る
      $sf_context->getResponse() sfResponseインスタンスを得る
      $sf_context->getUser() sfUserインスタンスを得る
  • $sf_request:requestオブジェクト(sfRequestインスタンス)
    • $sf_request->hasErrors() エラーが生じれば真
      $sf_request->getErrors() 生じたすべてのエラー内容の配列を得る
      $sf_request->getMethod() リクエストのメソッド(GETかPOSTか)を得る
      $sf_request->getParameter('a') パラメーター'a'の値を得る
  • $sf_params:リクエストのパラメーター
    • $sf_params->has('a') パラメーター'a'が存在すれば真
      $sf_params->get('a', 'default') パラメーター'a'の値を得る。得られなければ'default'を返す
  • $sf_user:現在のユーザーセッションオブジェクト(sfUserインスタンス)
    • $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」について見ていきます。

routing.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など)のデフォルト値を指定していきます。

リンクヘルパーとの関連

 先程のラベルに@をつけることで、リンクヘルパーで利用することができます。例えば

mod2/templates/indexSuccess.php(抜粋)
<?php echo link_to('Go to default page', '@default') ?>

 は、上記の「rouitng.yml」の下では「default:」の項が適用され、

link_to('Go to default page', 'default/index')

 と解釈されます(下図ステータスバー)。この方法を用いると、ルーティングがより高速になります。

routing.ymlラベル利用例
routing.ymlラベル利用例

.htmlを加えてみる

 「routing.yml」ではないのですが、アプリケーションフォルダの「settings.yml」では、URLの末尾の形を決めることができます。

settings.yml(抜粋)
prod:
  .settings
    suffix:  .html

 この「suffix:」の項で末尾の形を決められます。例えば「http://localhost/mod2/index」は「http://localhost/mod2/index.html」となり、URLとしてより自然になります(下図)。

「.html」を付加
「.html」を付加

次のページ
キャッシュ・コントロール

この記事は参考になりましたか?

symfony入門連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1063 2007/03/09 10:05

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー