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のコントローラのラッパーです。特に何もしてません。