ZendFrameworkのルーターを使わないルーティング
モジュールごとにルーターを作るのがめんどくさいので、コントローラー側でルーティングを実装させてみた話。
普通なら、
$route = new Zend_Controller_Router_Route( 'blog/archives/:id/*', array( 'module' => 'blog', 'controller' => 'archives', 'action' => 'view', 'id' => 'default' ) ); $front->getRouter()->addRoute('default', $route);
こうやってルートを追加するわけで、モジュールごとに変なルーティングさせたくてしょうがない時は、10個ぐらいルートを書くことになって大変なので、動的にモジュールの設定を読み込んでアクセスされたモジュールのルーターのみ有効になるようにしてるんだけど、この辺はまた別のお話。
結局、modulesディレクトリ以下に設定を記述しても、いろいろめんどくさい訳です。
無駄なことが大好きな、面倒くさがり屋な自分は、モジュールごとにルーティング方法を変えてみたりしているうちに、ルーターに飽きてしまいました。
そして、コントローラの中で完結できるルーティング方法を考えてみました。
上のルートの設定の様に、「http://domain.com/blog/archives/{articleId}/」でアクセスできる様にします。もちろんルーターを使わずに。
とりあえず、コントローラはこんな感じ。
class blog_archivesController extends ll_ActionController { public function init() { $this->_forward('default'); $this->_articleId = $this->getRequest()->getUserParam('action'); } public function default() { // $this->_articleIdの記事を取得する適当な処理 } }
以上。終わり。
エラーが出ない理由とかは知りませんが、アクションにidを突っ込んで、actionをinitで書き換えて、全部defaultに飛ばしてしまいます。
getActionでは'default'が取得されてしまうので、getUserParam('action')でgetRequest()の'action'の値をarticleIdとします。
ちなみにコントローラもdefaultで指定すれば、「http://domain.com/blog/{articleId}/」の形でも動く、かも。
※l_ActionControllerはZendのコントローラのラッパーです。特に何もしてません。