SHOEISHA iD

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

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

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

Zend Framework入門

PHPでよりユーザフレンドリなURLを設計するために - Zend_Controllerの新しいルーティング機能 -

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

標準のルーティング型への変更

 Zend Framework のバージョン 1.8から、標準的なルーティング型はZend_Translateコンポーネントと組み合わせて使うことができるようになりました。例えば英語圏の人向けのサービスで「http://zend.example.com/number/256」としていたところを、簡単に日本語圏の人向けに「http://zend.example.com/数/1999」という形でサービスを提供できるようになります。

 「index」コントローラーの「number」アクションにアクセスするのに、「http://~/number/(何かの数)」以外に「http://~/数/(何かの数)」でアクセスできるようにした例を見てみましょう。

リスト6 Zend_Translateとの組み合わせ(index.php)
/* (1)Zend_Translateのインスタンスを作成 */
$translator = new Zend_Translate(
    array(
        'adapter' => 'array',
        'content' => array('number' => 'number'),
        'locale'  => 'en'
	  ));

/* (2)「number」が日本語の「数」に対応することを追加 */
$translator->addTranslation(array('number' => '数'), 'ja');

/* (3)作成したtranslatorを登録 */
Zend_Controller_Router_Route::setDefaultTranslator($translator);

/* (4)ルートの作成と登録 */
$route_trans = new Zend_Controller_Router_Route(
    '@number/:value',//(4-1)
    array(
        'controller' => 'index',//(4-2)
        'action' => 'number',//(4-3)
	'message' => 'Zend_Translateを使ったサンプル'),
    array('value' => '\d+'//(4-4))
);
$router->addRoute('trans', $route_trans);

 ここでは、まず(1)トランスレータ(Zend_Translateのインスタンス)を作成した後(2)日本語の情報を登録しています。次に(3)このトランスレータを標準のルートで利用することを登録しています。

 (4)で標準のルートを作成しています。(4-1)はマッチするパスの指定で、固定要素「number」の後に動的な要素「value」がくるようなパスを指定しています。このパスにマッチした場合には(4-2)「index」コントローラの(4-3)「number」アクションに処理をディスパッチするように指定しています。(4-4)は動的な要素に関する制限を加えるところで、ここでは要素「value」は数にのみマッチするように指定しています。

 (4-1)で要素「number」を指定する際に「@number」と指定しています。このように要素名が「@」で開始された場合は、トランスレータが「number」から変換する単語にもマッチするようになります。

 例えばサンプルを「http://localhost/数/8」とアクセスすると次のように表示されます:

図2 Zend_Tranlrateを使った標準ルート
図2 Zend_Tranlrateを使った標準ルート

 なお、この記法の導入によって、今までルートを記述するための要素に名前が「@」で開始されていたものがあった場合には「@@」のようにエスケープして記述する必要があります。

トランスレータの登録

 先ほどの例ではsetDefaultTranslator静的メソッドを使ってトランスレータを登録しましたが、それ以外にもいくつかの方法があります。最も優先順位が高いのは、ルートのコンストラクタの引数でトランスレータを渡す方法です。

リスト7
$route = new Zend_Route($route,  $defaults, $reqs, $translator, $locale);
標準のルートのコンストラクタの引数
名前 説明
route ルートの定義
defaults デフォルトの値
reqs 正規表現による変数の制限
translator 利用するトランスレータ
locale トランスレータの利用するロケール(※後述)

 次は先ほども利用した、ルータのデフォルトのトランスレータとして登録する方法で、Zend_Controller_Router_RouteクラスのsetDefaulteTranslator静的メソッドを使います。

リスト8
Zend_Controller_Router_Route::setDefaultTranslator($translator);

 最後はMVCアプリケーション全体のトランスレータとして登録する方法で、Zend_Registryクラスのset静的メソッドを使います。

リスト9
Zend_Registry::set('Zend_Translate', $translator)

ロケールの指定

 トランスレータには複数のロケールを登録することができます。では、ルータはそのうちのどのロケールを利用するのでしょうか? 実は、これはルータを利用する方法によって変わって来ます。

 まず、上の例のように与えられたパスにマッチするかどうかを調べる場合にはトランスレータのデフォルトのロケールが利用されます。ここに関しては(Zend Framework バージョン1.10.8現在では)変更することができません。

 一方で、ルータにはパスを生成する機能(assembleメソッド)もあります。例えばZend_ViewコンポーネントのUrlヘルパーはルータのこの機能を利用しています。こちらに関しては、利用するロケールを指定できます。優先される順位から、

  1. assembleメソッドに「@locale」パラメータを渡して指定する
  2. 標準のルートを作成する際、コンストラクタで指定する
  3. Zend_Controller_Router_RouteクラスのsetDefaultLocale静的メソッドで指定する
  4. Zend_Registryクラスのset静的メソッドで、「Zend_Locale」プロパティに登録する

といった方法があります。

おわりに

 今回は以前紹介した時と比べ、Zend_Controllerコンポーネントのルーティングについて変更された点について紹介しました。2つのルートが追加され、標準のルートもZend_Translateコンポーネントと組み合わせて利用できるようになりました。

 次回は引き続きZend_Controllerの新しくなった点である、アクションヘルパーの変更について紹介したいと思います。

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Zend Framework入門連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、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/5526 2010/11/09 14:00

イベント

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

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

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

メールバックナンバー