Zend Framework のディレクトリ構成を考える

Zend Frameworkディレクトリ構成はデフォルトでは以下のようになっている。


http://framework.zend.com/manual/ja/zend.controller.html#zend.controller.quickstart.go

application/
    controllers/
        IndexController.php
    models/
    views/


簡単なシステムだと、controllers の配下にcontroller ファイルを設置すれば良いが、
ファイルが多くなってくると、controllers にファイル数が多くなってメンテし難くなる。


そこで、以下のようなディレクトリ構成にしてみる。

application/
    modules
        index
           controllers/
               IndexController.php
           models/
           views/
        youtube
           controllers/
               IndexController.php
           views/

この場合だと、モジュール単位で構成されるので、メンテしやすくなる。
ただし、このままだとディスパッチャが アクションコントローラを探せなくなり、Zend_Controller_Exception が発行されてしまう。


そこで、以下のように設定する。
http://framework.zend.com/manual/ja/zend.controller.modular.html

<?php
$front = Zend_Controller_Front::getInstance();
$front->setControllerDirectory(array(
    'default'    => 'pathto/modules/index/controller',
    'youtube'  => 'pathto/modules/youtube/contoller'
));
$front->dispatch();

※ setControllerDirectory() の引数はベタで書くより、設定ファイルにコントローラへのパスを記述して読み込み、設定している。

アクションコントローラの記述

デフォルトのディレクトリ構成から変更した場合、
アクションコントローラのクラス名も変更する必要がある。
※ default で設定したアクションコントローラとそれ以外は形式がことなる。


ここではIndexContollerはデフォルトになるので、デフォルトのIndexControllerは以下のようなクラス名になる。
application/modules/index/controller/IndexController.php

<?php
class IndexController extends My_Controller_Action
{
    public function indexAction()
    {
    }
    public function fooAction()
    {
    }
}

※ My_Controller_Action はZend_Controller_Action から継承したクラス。


default ではない youtube というcontroller は次のようになる。
application/modules/youtube/controller/IndexController.php

<?php
class Youtube_IndexController extends My_Controller_Action
{
    public function indexAction()
    {
    }
    public function fooAction()
    {
    }
}

アクセスする URL

アクセスする URL は以下のようになる。
default に設定してあるコントローラの場合は、従来通りの、
http://ドメイン名/コントローラ名/アクション名/ となる。

application/modules/index/controller/IndexController.php
indexAction
http://localhost/
http://localhost/index
http://localhost/index/index

fooAction
http://localhost/index/foo


default に設定したコントローラ以外は以下の形式。
http://ドメイン名/モジュール名/コントローラ名/アクション名 となる。
application/modules/youtube/controller/IndexController.php

indexAction
http://localhost/youtube
http://localhost/youtube/index/index

fooAction
http://localhost/youtube/index/foo


Zend Framework のドキュメントは細かく書かれていて分かりやすい。
逆に規約外の事をやろうとするとハマる場合が多い。