【问题标题】:Optimum filesystem structure for scripting language MVC applications脚本语言 MVC 应用程序的最佳文件系统结构
【发布时间】:2009-09-10 19:35:59
【问题描述】:

当我谈到脚本语言时,我指的是 Python、Perl 和(就我而言)PHP 等语言。在使用 CodeIgniter、Zend 和许多其他有趣的 MVC 系统之后,似乎很明显,一个人似乎同意的一件事是文件夹结构(以及其他事情_like_that)。这确实给我带来了问题,因为我找不到任何关于不同结构设计的好处的好的文档。大多数人只是推荐一个,因为这是他们使用的,而不考虑改进设计。

我希望我们都同意的一件事是,在自动加载类时检查文件系统中的现有文件是非常糟糕的做法。我们的类不应位于 5 个可能的位置之一,这会导致对我们加载的每个库进行大量的 file_exists() 检查。

因此,无论如何,我正在尝试收集可以比较的目录结构,以便在规划应用程序时找到最佳实践:

  1. 基于 OOP,这很可能意味着 MVC
  2. 范围国际化并支持语言文件/翻译
  3. 对模块/插件开放,因此可以将完整的包放入我们的代码库中
  4. 明确定义正在发生的事情以及在哪里查找给定的类
  5. 可能支持在同一结构下运行的多个站点(请参阅下面的 /site 目录)

这就是我目前所拥有的。请记住,libs 只是一个术语,表示您的主库/类目录,甚至可能包含模型,具体取决于文件夹结构。另外,我排除了任何类型的静态内容(JS/CSS/图像),因为这些东西是事后才想到的,与我们的服务器端代码无关——它甚至可能在另一台服务器上!缓存、文件上传、语言和所有其他生成的内容也是如此。

/controllers
/views
/models
/libs
/config
index.php

这让我想起了 Zend 框架,它将所有内容都堆放在一个 libs 文件夹中(其中还包括子文件夹以保持事物井井有条)。仅适用于单个站点。


/libs
/site
    /controllers
    /views
    /models
    /config
index.php

这将是上述结构的多站点版本。


/libs
/functions
/site
    /controllers
    /models
    /views
    /config
/site2
    /controllers
    /models
    /views
    /config
/modules
    /user
        /controllers
        /models
        /views
index.php

这将是允许多个站点和插入模块的版本。这些模块将是独立的 MVC 应用程序,例如包含业务逻辑、CRUD 和视图的论坛。

那么有没有人完美的结构可以分享或指导我选择一个好的可扩展设计?

【问题讨论】:

    标签: php model-view-controller filesystems


    【解决方案1】:

    这是一个过于复杂的示例,它很好地组织了所有内容 - 以清晰和简单为代价。


    (来源:gsdesign.ro)

    【讨论】:

    • 看起来像 Zend Framework 的骨架结构,我也很满意!它允许根据您的需要轻松扩展结构。为此,我喜欢在存储项目范围、树、数据库架构等的位置添加 /etc 目录...
    • 遗憾的是,得票最多的答案是我自己的。所以我并没有比以前好过……那是怎么回事? ;P
    【解决方案2】:

    不是特别推荐symfony,而是它的方法,我认为是pretty good(但不是“完美”)

    允许:

    • I18N
    • 多种环境(dev、qa、prod 等)
    • 外部库
    • 插件
    • 多个网站(域或其他)
    • 批处理(命令行任务)
    • 单元测试
    • 文档
    • 日志记录
    • 缓存

    另外,在 symfony 的起起落落中,我认为它做得很好的一件事是缓存。我的意思不是template/view caching - 我的意思是compilation-like caching。

    当一个项目第一次执行时,symfony 会构建一个库类的主文件,当应用程序连续命中时,它不仅会删除每个请求的数十甚至数百个 stat 调用,还会执行其他优化,例如删除厘米。

    它还缓存配置数据和自动加载信息,所有这些都可以根据您的需要进行调整。

    【讨论】:

    • 你提到的最后一件事听起来完全是浪费 symfony 方面的努力。为什么不直接使用像 APC、XCache 或 eAccelerator 这样的操作码缓存系统?
    • 是的,感谢分享 symfony 风格。从我的简要来看,它没有做的一件事是共享模块。每个站点,然后是每个应用程序(前端/后端)都有自己的模块目录,这意味着您必须根据计划使用每个模块制作尽可能多的副本。因此,它不再是一个全球性的模块理念,而是一个单一的本地图书馆理念。
    【解决方案3】:

    对于我们内部构建的多站点论坛引擎,我们使用类似于您上次“多站点”选项的结构,并且效果非常好。如果需要,您可以随时复制模块,它还允许站点 A 稍微自定义其模块而不影响站点 B。

    当您进入实际应用时,您所谈论的是完全独立的团队,甚至可能是使用这两个网站的企业,稍微划分并不是最糟糕的事情。我们也有一个共享模块文件夹,但如果您在站点的模块文件夹中命名一个相同的文件,它将使用该版本。使用它和 __autoload(假设是 PHP),站点开发人员不必担心模块的位置来使用它。

    【讨论】:

    • 这是一个很好的观点。您拥有两个不同站点的事实意味着(如果它们很大)您可能在它们之间几乎没有相关性。特别是如果这是一个指示自定义代码的框架。然而,从 drupal/wordpress 的方法中,我们看到很多时候 1000 个站点都可以使用相同的插件/模块,而只更改 CSS。这就是我希望在设计中实现的目标。
    • "我们也有一个共享模块文件夹,但如果您在站点的模块文件夹中为一个文件命名相同的名称,它将使用该版本。"这就是我想象的工作方式 - 除了如果一个模块仅用于一个站点,那么它可能会被解压缩到组成它的控制器/模型/视图中并放在适当的位置。
    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2011-10-05
    相关资源
    最近更新 更多