脚本语言MVC应用程序的最佳文件系统结构

时间:2009-09-10 19:35:59

标签: php model-view-controller filesystems

当我谈到脚本语言时,我说的是Python,Perl和(在我的例子中)PHP这样的语言。在使用CodeIgniter,Zend和许多其他有趣的MVC系统后,似乎很清楚,一个人似乎同意的一件事是文件夹结构(沿着与事物有关的东西)。这对我来说真的是一个问题,因为我找不到任何关于不同结构设计的好处的好文档。大多数人只推荐一个,因为是他们使用的,而不考虑设计的改进。

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

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

  1. 基于OOP的最可能意味着MVC
  2. 国际范围和支持语言文件/翻译
  3. 对模块/插件开放,以便可以将完整的包放入我们的代码库中
  4. 清楚地定义发生了什么以及在哪里查找给定的类
  5. 可能支持多个站点运行相同的结构(请参阅下面的/ site目录)
  6. 所以这就是我到目前为止所拥有的。请记住,libs只是一个术语,意味着您的主库/类目录,甚至可能包含模型,具体取决于文件夹结构。此外,我排除了任何类型的静态内容(JS / CSS /图像),因为这些内容实际上是经过深思熟虑而与我们的服务器端代码无关 - 它甚至可能在另一台服务器上!缓存,文件上传,lang和所有其他生成的内容也是如此。

    /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和视图。

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

3 个答案:

答案 0 :(得分:6)

这是一个过于复杂的例子,可以很好地组织一切 - 以清晰和简单为代价。

alt text
(来源:gsdesign.ro

答案 1 :(得分:3)

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

允许:

  • I18N
  • 多个环境(dev,qa,prod等)
  • 外部图书馆
  • 插件
  • 多个网站(域名或其他方式)
  • 批处理(命令行任务)
  • 单元测试
  • 文档
  • 登录
  • 缓存

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

当项目第一次执行时,symfony会构建一个库类的主文件,在连续点击应用程序后,不仅会删除每个请求的数十个甚至数百个静态调用,还会执行其他优化,例如删除评价。

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

答案 2 :(得分:1)

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

当你进入实际应用时,你谈论的是完全独立的团队,甚至是使用这两个网站的企业,一点点划分并不是最糟糕的事情。我们还有一个共享模块文件夹,但如果您在Site的modules文件夹中将文件命名为相同的内容,则它会使用该版本。使用它和__autoload(假设是PHP),那么Site devs实际上不必担心模块的位置来使用它。