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'で始めておけば良いと思います。

ルールを書く順番が微妙にやっかいだ....


細かい動作検証はしてないが、とりあえずやりたい事はできたんで良しとする。


コントローラ毎に設定ファイルを作って読み込ませる、とかはこれから考える。