isseium's blog

田舎に住むWebエンジニアのブログ

Zend Framework の index.php 内で モジュール名等を取得

※ isseium が2009/02/03 に書いた記事を、ブログ移転のため転載したものです。情報が古い可能性があります。


いろいろ拡張しているなかで、View側に今のモジュール名を使いたくなった。

アクションコントローラのpreDispatch内に

    $req = $this->getRequest();
    $moduleName = $req->getModuleName();
    $controllerName = $req->getControllerName();
    $actionName = $req->getActionName();

と書けばいいのだが、各アクションコントローラに毎回書くのは面倒。


また正攻法として、Zend_Controller_Action(_Abstract) を継承するような自作クラスを作ればよいのだが、いまさらすべてのコントローラ名を変える気にもならん。

というわけで、index.php内でモジュール名やコントローラ名等の情報を取得すればいいじゃんということで調べて実現しました。

    // Module名などを取得して、viewに格納
    $router = new Zend_Controller_Router_Rewrite(); // ルータの生成
    $req = $router->route(new Zend_Controller_Request_Http());

    // 基本リクエスト情報呼び出し
    $moduleName = $req->getModuleName();
    $controllerName = $req->getControllerName();
    $actionName = $req->getActionName();

これによって、index.php内でモジュール名等の情報を取得できます。


ActionControllerで使っていたリクエスト(= $this->getRequest() )を使えますので、 $req->getBaseUrl() といったメソッドで、現在のベースURLを取得もできます。


ただし、これはindex.phpを呼ばれた時点でのURLを解析するため、アクションコントローラ内でフォワード処理があった場合には情報が更新されませんので注意が必要です。

※本来の目的である、Viewに自動で反映させるコード

さっきのコードの下にこれを付け加えます。

    // 格納
    $urlInfo = array(
    'M' => $moduleName,
    'C' => $controllerName,
    'A' => $actionName,
    );

    $view->urlInfo = $zendInfo;

これによって、Viewファイル(自分はSmartyを使用)で

    {$urlInfo.M}

と書くことで、モジュール名を取得できました。