標準のルーティング型への変更
Zend Framework のバージョン 1.8から、標準的なルーティング型はZend_Translateコンポーネントと組み合わせて使うことができるようになりました。例えば英語圏の人向けのサービスで「http://zend.example.com/number/256」としていたところを、簡単に日本語圏の人向けに「http://zend.example.com/数/1999」という形でサービスを提供できるようになります。
「index」コントローラーの「number」アクションにアクセスするのに、「http://~/number/(何かの数)」以外に「http://~/数/(何かの数)」でアクセスできるようにした例を見てみましょう。
/* (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」とアクセスすると次のように表示されます:
なお、この記法の導入によって、今までルートを記述するための要素に名前が「@」で開始されていたものがあった場合には「@@」のようにエスケープして記述する必要があります。
トランスレータの登録
先ほどの例ではsetDefaultTranslator静的メソッドを使ってトランスレータを登録しましたが、それ以外にもいくつかの方法があります。最も優先順位が高いのは、ルートのコンストラクタの引数でトランスレータを渡す方法です。
$route = new Zend_Route($route, $defaults, $reqs, $translator, $locale);
| 名前 | 説明 |
| route | ルートの定義 |
| defaults | デフォルトの値 |
| reqs | 正規表現による変数の制限 |
| translator | 利用するトランスレータ |
| locale | トランスレータの利用するロケール(※後述) |
次は先ほども利用した、ルータのデフォルトのトランスレータとして登録する方法で、Zend_Controller_Router_RouteクラスのsetDefaulteTranslator静的メソッドを使います。
Zend_Controller_Router_Route::setDefaultTranslator($translator);
最後はMVCアプリケーション全体のトランスレータとして登録する方法で、Zend_Registryクラスのset静的メソッドを使います。
Zend_Registry::set('Zend_Translate', $translator)
ロケールの指定
トランスレータには複数のロケールを登録することができます。では、ルータはそのうちのどのロケールを利用するのでしょうか? 実は、これはルータを利用する方法によって変わって来ます。
まず、上の例のように与えられたパスにマッチするかどうかを調べる場合にはトランスレータのデフォルトのロケールが利用されます。ここに関しては(Zend Framework バージョン1.10.8現在では)変更することができません。
一方で、ルータにはパスを生成する機能(assembleメソッド)もあります。例えばZend_ViewコンポーネントのUrlヘルパーはルータのこの機能を利用しています。こちらに関しては、利用するロケールを指定できます。優先される順位から、
- assembleメソッドに「@locale」パラメータを渡して指定する
- 標準のルートを作成する際、コンストラクタで指定する
- Zend_Controller_Router_RouteクラスのsetDefaultLocale静的メソッドで指定する
- Zend_Registryクラスのset静的メソッドで、「Zend_Locale」プロパティに登録する
といった方法があります。
おわりに
今回は以前紹介した時と比べ、Zend_Controllerコンポーネントのルーティングについて変更された点について紹介しました。2つのルートが追加され、標準のルートもZend_Translateコンポーネントと組み合わせて利用できるようになりました。
次回は引き続きZend_Controllerの新しくなった点である、アクションヘルパーの変更について紹介したいと思います。

