前回は「コントローラ名」と「アクション名」を使ってアクションに処理が渡される部分を掘り下げました。

それではZend FrameworkのMVC設計でアプリケーション開発を実践的に行う第一歩として、トップページを作ることを考えましょう。

とは言っても既にこれまで使ってきた「コントローラ名」と「アクション名」がindexのものがあります。
このindex/indexはデフォルトのものなので、もっとアプリケーションらしい名前に変えるべきでしょう。
いかにもアプリケーションのトップページですよ的な名前が分りやすくていいですね。

「コントローラ名」=appli
「アクション名」  =top


これでどうでしょう?

で、これだけだとただ名前を変えただけです。
これにトップページの役割りとして、コントローラ名やアクション名が存在しない場合にエラー表示にしないで、トップページを表示させるようにしてみましょう。
できるだけエラー画面を出さない方がなんだか安定感のあるサイトだと印象付けられるんじゃないかという狙いです。(個人的意見)

名前を変えるにはフロントコントローラのオブジェクトが持つsetDefaultControllerName()メソッドおよびsetDefaultAction()メソッドに指定します。
たったこれだけです。

変更すると当然のことながらIndexControllerではなくAppliControllerクラスをデフォルトで呼ぶようになるのでこれを用意します。

以上がデフォルトの「コントローラ名」と「アクション名」を変えるやり方です。


次は、存在しない「コントローラ名」でリクエストが来た時に、デフォルト(appli)へ飛ばす仕組みを作ります。
これのやり方もフロントコントローラでuseDefaultControllerAlwaysパラメータを有効に設定するだけで済みます。
簡単ですね。


では最後に、存在しない「アクション名」でリクエストが来た時に、デフォルト(top)へ飛ばす仕組みを作ります。
これを実現させるにはアクションコントローラにPHPのマジックメソッド__call()を実装します。

それでは書いていきましょう。
フロントコントローラにはデフォルトの「コントローラ名」と「アクション名」を指定して、存在しないコントローラ名でリクエストが来たらデフォルトのコントローラを使う設定にします。

フロントコントローラ - index.php
<?php

// Zendパスを通す
set_include_path('C:\xampp');

// 必要なクラス定義を読み込む
require_once 'Zend/Controller/Front.php';

// アクションコントローラへ丸投げ
$front = Zend_Controller_Front::getInstance();
$front->setControllerDirectory('../application/controllers');
$front->setDefaultControllerName('appli');
$front->setDefaultAction('top');
$front->setParam('useDefaultControllerAlways', true);
$front->dispatch();


上記のように、たった3行を加えるだけで済みました。

フロントコントローラは基本的に書き変えるべきでないと以前書きましたが、アプリケーションがどれに変わったとしても共通な部分としてくくり出せるものはフロントコントローラに書くようにしていくといいと思います。
コード量が増えたとしてもたかが知れてるのでキチンと整理して書いていけば問題ないでしょう。

次はアクションコントローラに、存在しないアクションがリクエストされて来た場合にデフォルトのアクションを使う仕組みを追加します。

アクションコントローラ - AppliController.php
<?php
require_once 'Zend/Controller/Action.php';

class AppliController extends Zend_Controller_Action
{
  public function topAction() {

  }
  public function __call($name, $args) {

    if (substr($name, -6) === 'Action') {
      return $this->_redirect('/');
    }

    throw new Exception('Method not found: ' . $name);
  }
}


実装していないfooというアクション名でリクエストが来た場合に、fooAction()メソッドを呼ぼうとします。
ところがメソッドが無いので代わりにマジックメソッド__call()が呼ばれる流れになります。
__call()ではアクションを呼ぼうとして無かった場合のみリダイレクトしています。
_redirect('/')と指定すると、ベースURLへのリダイレクトとなります。
なので「コントローラ名」および「アクション名」が省略されたリクエストとなり、デフォルト値(つまりトップページ)を呼ぶことになります。

ビュースクリプト - appli/top.phtml
<html>
<body>
  ここがトップページだよん!
</body>
</html>


ファイルを配置できたら、ベースURLやトップページ、存在しないページURLをリクエストしてみましょう。

http://localhost/
http://localhost/appli
http://localhost/appli/top
http://localhost/appli/foo
http://localhost/appli.html
http://localhost/foo
http://localhost/foo/bar


どんなリクエストでもエラー画面にならずにトップページが表示できれば成功です!!

以前「Zend Frameworkを使う[3]」で作成したエラーコントローラには、コントローラが見つからない場合やアクションが見つからない場合の処理も書いていました。
今回の設定をすることにより、コントローラやアクションが見つからなくてもエラーへは行かなくなり、その部分は必要なくなるでしょう。

しかし、ZFで開発されたどんなアプリケーションにも対応できるよう残しておきましょう。
作っていけば行くほど、資産にしていきましょう。