Zend Controller内でのルーティング
Zend Frameworkのルーティングがちょっと気に入らない。
1. URLと別のコントローラに飛ばすことは稀。
2. 設定ファイルが大きくなりすぎるので、適度に分離したい。
3. 設定とプログラムが分離しすぎてて可読性がちょっと低い。
こんな感じになった。
Controller の init メソッドで
<?php public function init() { parent::init(); $router = $this->getFrontController()->getRouter(); $routing = array( 'top' => new Zend_Controller_Router_Route( ':controller/:owner', array('action' => 'index') ), 'action' => new Zend_Controller_Router_Route( ':controller/:owner/:action' ) ); foreach ($routing as $_key => $_value){ $router->addRoute( $_key, $_value ); } $router->route( $this->getRequest() ); }
と、思ったとおりのアクションに飛ばせた。
アクションは、preDispatch() の直前にリクエストオブジェクトから取ってくるので、init内での変更は問題無し。
(なので、これをpreDispatchでやっても無視されます)
設定の仕方は普通のルーティングとほぼ同じだと思われる。
URLのマッピングは、':controller'で始めておけば良いと思います。
ルールを書く順番が微妙にやっかいだ....
細かい動作検証はしてないが、とりあえずやりたい事はできたんで良しとする。
コントローラ毎に設定ファイルを作って読み込ませる、とかはこれから考える。