【问题标题】:Directory Structure for MVCMVC 的目录结构
【发布时间】:2011-12-19 01:39:00
【问题描述】:

我正在尝试清理我一直在开发的框架。目前,该站点由以下目录组成:

Models
Views
Controllers
Helpers (Miscellaneous functions)
Libraries (Universal classes, like library and session management)
Images
Style

每当调用页面时,路由器脚本都会查找关联的控制器,因此site.com/login 将在'/controllers/login.php' 处实例化Login_Controller 我面临的问题是,路由器脚本本身感觉就像一种控制器一样,view.php 也是如此,它处理要由适当的视图处理的格式化数据。但这些并不像页面控制器,因为它们控制 MVC 本身。我对这种架构仍然有些陌生,我很好奇有更多经验的人会如何组织它。

我可以将路由器和视图控制器分类为库,还是在 /controllers 中创建一个名为“pages”的子目录或其他任何想法会更好?非常感谢。

【问题讨论】:

  • 通常,您上面列出的文件夹将位于一个名为“app”的文件夹中,而实际运行您的框架的代码将存储在它自己的名为“core”的文件夹中。
  • 您可能还希望将其中的大部分内容移出您的公共目录,并使用包含路径来抓取文件。由于 Style 和 Images 文件夹,我假设它当前位于公共目录中。
  • 所以我会在站点根目录上有模型、视图、控制器目录,然后是 /application/controller 用于 router.php 和 view.php?只是想知道什么被认为是标准的,如果有的话。

标签: model-view-controller architecture php


【解决方案1】:

我建议你研究一下框架的目录结构,比如 symfony2 或 yii

这是我为我选择的:

public_html/              (for public files) (should be public, place only index.php in here)
public_html/css/
public_html/images
public_html/js            (for your js files, or custom generated ones)
lib/                      (for my libs)  (should be private)
lib/vendor/               (for 3rd party libs)
application/              (for the whole app) (should be private)
application/class         (classes that make the app work such as mainApp, Controller, Model, View, etc...)
application/class/model   (all the models)
application/class/view    (all the views)
application/class/view/html (templates used by the views)
application/class/controller (all controllers)
application/class/helper  (helper functions)
application/class/lib     (libs that you develop for the application)
application/template      (layout and/or templates for the application)
application/conf          (config files)
application/log           (log files)
application/cron          (scheduled jobs)
application/database      (for database migration scripts)
...

您还可以使用文件命名约定,例如:YourClassName.class.php 用于 clases,YourView.phtml 用于您的视图等。检查一个框架,您将学习如何很好地构建和应用程序。

【讨论】:

  • 谢谢,这很有帮助。我假设 view.php 会放在 /view 中,然后所有其余的模板文件都会放在 /view/html 中,但是您建议将 router.php 放在哪里?它几乎是系统其余部分的入口点。
  • 对于我使用 /index.php 的路由器,它是引导程序,在其中我使用 mainApp 类之外的一个实例,它管理任何“全局操作”(路由、缓存、控制器调用、日志记录、错误)... 虽然我通过 apache 的 mod_rewrite 模块进行路由处理
  • 关于视图...您是,但我正在编辑我的答案,以便更清楚地显示我打算解释的内容
  • 我从上面的地图中使用了很多,这真的很有帮助。我特别喜欢将所有文件夹移动到公用文件夹上方以确保安全。顶尖!就路由器而言,我在系统的基本应用程序目录中创建了一个 route.php。它与 config.php 一起坐在那里。我使用config建立文件目录和其他重要信息,路由只包含config和runs。所以我的应用程序只需要在 index.php 中调用以下内容 require('../app/router.php'); //初始化路由器 $app = new Router; //路由并运行 $app->route();就这样吧!
【解决方案2】:

我建议遵循 Symfony 1.x 目录结构。清晰、合乎逻辑、安全。

摘自 Fabien Potencier 和 François Zaninotto 的书 "The definitive guide to Symfony"

apps/
  frontend/
  backend/
cache/
config/
data/
  sql/
doc/
lib/
  model/
log/
plugins/
test/
  bootstrap/
  unit/
  functional/
web/
  css/
  images/
  js/
  uploads/
  • apps/ 包含项目的每个应用程序的一个目录(通常是前端 以及前台和后台的后台)。
  • cache/ 包含配置的缓存版本,以及(如果您激活它) 项目的动作和模板的缓存版本。缓存机制 (在第 12 章中详细介绍)使用这些文件来加快对 Web 请求的响应。 每个应用程序都会有一个子目录,包含预处理的 PHP 和 HTML 文件。
  • config/ 保存项目的一般配置。
  • data/ 在这里,您可以存储项目的数据文件,如数据库架构、SQL 创建表的文件,甚至是 SQLite 数据库文件。
  • doc/ 存储项目文档,包括您自己的文档和 PHPdoc 生成的文档。
  • lib/ 专用于外部类或库。在这里,您可以添加需要的代码 在您的应用程序之间共享。 model/ 子目录存储 项目的对象模型(在第 8 章中描述)。
  • log/ 存储 symfony 直接生成的适用日志文件。它还可以包含 Web 服务器日志文件、数据库日志文件或项目任何部分的日志文件。 Symfony 为每个应用程序和每个环境创建一个日志文件(日志文件是 第 16 章讨论)。
  • plugins/ 存放应用中安装的插件(插件在章节中讨论 17).
  • test/ 包含用 PHP 编写并与 symfony 测试框架(在第 15 章讨论)。在项目设置过程中, symfony 自动添加一些带有一些基本测试的存根。
  • web/ 网络服务器的根。唯一可从 Internet 访问的文件是 位于此目录中的那些。

【讨论】:

  • 链接失效了。
  • 感谢迈克的信息;更新了我的答案 + 复制/粘贴/格式化原始文档的相关摘录
  • @FrostyZ 现在 Symfony 是 5.x 版 你有相同的链接,但最新版本的 Symfony 吗? 1.x 版本已过时
  • @Esteban 这是 Symfony 6.0 文档 symfony.com/doc/current/… 的目录结构,但看起来不像 1.x 那样有文档记录。我不再使用 Symfony,所以我无法详细解释。也许我应该删除现在看起来已经过时的答案。
  • @FrostyZ (1/2) 你现在使用什么框架?我正在阅读Laminas 目录结构,我认为回答原始问题有点复杂。我在几乎所有框架中都看到对于每个应用程序或“web”模块它都有模型、控制器和视图文件夹以实现 MVC 架构,但是如果我有 3 个应用程序(在同一个项目中)呢因为他们重用了相同的业务逻辑......)在这种情况下目录结构怎么可能?
【解决方案3】:

我不会称自己为专家,但一种解决方案是将您的“框架”从实施中移开。我的意思是将您的“路由器”、“view.php”和其他框架类移动到某个外部位置,然后将其包含在您的 index.php 或任何文件中作为您的访问点。

那么只有内容会在您的实际应用程序目录中,而所有框架文件都将位于无法通过 Web 服务器访问的位置。

只是一个想法:)

【讨论】:

    【解决方案4】:

    【讨论】:

    • 嗨,kta,我知道这是一个旧答案,但您的链接可能很快就会遭受链接失效。你介意重新审视这个答案吗?
    【解决方案5】:

    我无法编辑@kta 的答案,因为编辑队列已满,但该链接可能很快就会出现链接失效。 Zend Framework 网站正在消失并被 Laminas 项目所取代。以下是original link的总结:

    下面描述了列出的每个目录的用例。

    application/:此目录包含您的应用程序。它将容纳 MVC 系统,以及使用的配置、服务和引导文件。

    configs/:应用程序范围的配置目录。

    controllers/、models/ 和 views/:这些目录用作默认的控制器、模型或视图目录。在应用程序目录中包含这三个目录为启动简单项目以及启动具有全局控制器/模型/视图的模块化项目提供了最佳布局。

    controllers/helpers/:这些目录将包含操作助手。动作助手将被命名为默认模块的“Controller_Helper_”或其他模块的“_Controller_Helper”。

    layouts/:此布局目录用于基于 MVC 的布局。由于 Zend_Layout 能够进行基于 MVC 和非 MVC 的布局,因此该目录的位置反映了布局与控制器不是一对一的关系,并且独立于 views/ 中的模板。

    modules/:模块允许开发人员将一组相关的控制器分组到一个逻辑组织的组中。模块目录下的结构类似于应用程序目录下的结构。

    services/:此目录用于存放您的应用程序提供的特定于应用程序的 Web 服务文件,或用于为您的模型实现 » 服务层。

    Bootstrap.php:该文件是应用程序的入口点,应该实现 Zend_Application_Bootstrap_Bootstrapper。此文件的目的是引导应用程序并通过初始化组件使应用程序可用。

    data/:这个目录提供了一个存储应用程序数据的地方,这些数据是易失的并且可能是临时的。此目录中数据的干扰可能会导致应用程序失败。此外,此目录中的信息可能会或可能不会提交到 subversion 存储库。此目录中的内容示例包括会话文件、缓存文件、sqlite 数据库、日志和索引。

    docs/:此目录包含生成或直接编写的文档。

    library/:此目录用于存放应用程序所依赖的常用库,应位于 PHP 的 include_path 中。开发人员应该按照 PHP 手册的 » Userland Naming Guide 以及 Zend 自己制定的指南,将他们的应用程序库代码放在这个目录下的唯一命名空间中。这个目录也可能包括 Zend Framework 本身;如果是这样,你会把它放在 library/Zend/ 中。

    public/:此目录包含应用程序的所有公共文件。 index.php 设置并调用 Zend_Application,然后调用 application/Bootstrap.php 文件,从而调度前端控制器。您的 Web 服务器的 Web 根目录通常会设置为此目录。

    scripts/:此目录包含维护和/或构建脚本。此类脚本可能包括命令行、cron 或 phing 构建脚本,它们不在运行时执行,但属于应用程序正确运行的一部分。

    temp/:temp/ 文件夹是为临时应用程序数据预留的。此信息通常不会提交到应用程序 svn 存储库。如果 temp/ 目录下的数据被删除,应用程序应该能够继续运行,但性能可能会下降,直到数据再次恢复或重新缓存。

    tests/:此目录包含应用程序测试。这些可以是手写的、PHPUnit 测试、基于 Selenium-RC 的测试或基于其他一些测试框架。默认情况下,可以通过模仿 library/ 目录的目录结构来测试库代码。此外,可以模仿 application/ 目录结构(包括 application 子目录)编写应用程序的功能测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多