MVCフレームワーク

ディレクトリ構成

ディレクトリ構成

MVCフレームワークにおいてはその性質上、システムのディレクトリ構成も規則に従う必要があります。通常の実装とは違い、ある一定のルールに従った構成にすることで成り立つものです。

そこでMVCにおけるディレクトリ構成をどうするかですが、
まず、webサイト関連のルートディレクトリ直下にフレームワークのディレクトリを作るとします。

このコーナーにで出てきているのは全てMVCに絡むクラスばかりなので、
とりあえず、mvcというディレクトリの下に格納します。

その他、ライブラリ等を作ればまた別のディレクトリを作る想定です。

(ROOT)/
  ∟framework/
    ∟mvc/
      ∟ControllerBase.php
      ∟Dispatcher.php
      ∟ModelBase.php
      ∟Post.php
      ∟QueryString.php
      ∟Request.php
      ∟UrlParameter.php
      ∟Smarty/
        

このframework以下のクラスはあらゆるシステムで共通に使うものです。

次に、個々のシステム(Webサイト単位)のディレクトリを作ります。

(ROOT)/
  ∟framework/
    ∟mvc/
      ∟ControllerBase.php
      ∟Dispatcher.php
      ∟ModelBase.php
      ∟Post.php
      ∟QueryString.php
      ∟Request.php
      ∟UrlParameter.php
      ∟Smarty/ 
 
  ∟tuuhan/ (通販サイト)

  ∟cooking/ (お料理サイト)


        

で、各システムのディレクトリ構成は、フレームワークで規定されるとおりに従います。
その規定をどのようにするかですが、

MVCとして綺麗なのは以下のような感じでしょうか。

  ∟tuuhan/ (通販サイト)
    ∟controllers/
      ∟IndexController.php
      ∟CartController.php
      ∟ProductsController.php
      ∟RankingController.php
    ∟models/
      ∟Cart.php
      ∟CartProduct.php
      ∟Product.php
      ∟Customer.php
    ∟views/
      ∟templates/
        ∟index/
          ∟index.tpl
        ∟cart/
          ∟index.tpl
        ∟products/
          ∟list.tpl
          ∟detail.tpl
        ∟ranking/
          ∟product.tpl
          ∟shop.tpl
      ∟templates_c/
    ∟htdocs/
      ∟css/
      ∟images/
      ∟js/
      ∟.htaccess
      ∟index.php

つまり、MVCのMとVとCをそれぞれ明確にディレクトリ分けし、
コントローラークラスのファイルは全てcontrollersの中へ、
モデルクラスのファイルは全てmodelsの中へ、
ビューテンプレートはviewsの下のtemplatesの中へ、
という感じです。

ディレクトリ構成上もMVCの区分けを重視した例です。

ちなみにhtdocsが、実際のweb公開ディレクトリです。
つまりこのhtdocs以下は、通常のアクセス領域になります。直接URLがディレクトリ階層を現す領域ですね。

注目すべきは、直接外部よりアクセスできるスクリプトはindex.phpのみということです。

セキュリティ上も、クラスファイルなど直接外部より参照できる必要のないものは全て公開ディレクトリの外に置くことが望ましいです。

システムが一切絡まない、完全な静的HTMLがある場合はhtdocs以下に配置することになります。



次に別の例です。

    ∟app/
      ∟index/
        ∟IndexController.php
        ∟IndexModel.php
      ∟cart/
        ∟CartController.php
        ∟CartModel.php
      ∟products/
        ∟ProductsController.php
        ∟ProductsModel.php
      ∟ranking/
        ∟RankingController.php
        ∟RankingModel.php
    ∟views/
      ∟templates/
        ∟index/
          ∟index.tpl
        ∟cart/
          ∟index.tpl
        ∟products/
          ∟list.tpl
          ∟detail.tpl
        ∟ranking/
          ∟product.tpl
          ∟shop.tpl
      ∟templates_c/
    ∟htdocs/
      ∟css/
      ∟images/
      ∟js/
      ∟.htaccess
      ∟index.php

これは機能という単位を重視した構成です。

ディレクトリ上にコントローラーとモデルの切り分けはなく、
コントローラー名別に関連クラスをまとめた形です。

コントローラーとモデルを一対にするような仕組みにする場合には有効な構成と言えます。

どの機能(ページ)でどのクラスを使っているのかが分かりやすく、
大規模なサイトで機能が多いような場合はこちらのほうが整理されて管理しやすいでしょう。

ちなみにappというのはクラス関係のファイルをまとめるルートディレクトリの意味合いです。

ビューテンプレートに関しては、Smartyを使用することを前提とした場合、
Smartyの性質上、テンプレートはテンプレート専用のルートディレクトリを作ってその中に入れるのが望ましいのでこのような構成になります。


ディレクトリ構成をどう決めるかにより、Dispatcherクラスの処理内容が変わってきますので、ディレクトリ構成は最初に考えます。
どのようにするかはお好みでよいと思います。