PHP项目的文件夹结构

9

我决定从头开始完全重写我的旧PHP项目。以前,每个页面都有一个文件,现在我想采用MVC模式的方法,只使用一个入口点。这个项目本身非常大,我正在尝试构建自己的框架,以便可以很好地集成所有内容。

我在stackoverflow上搜索了类似的问题,但它们的文件夹结构相当不同,所以我决定发布自己的问题。

到目前为止的文件夹结构

/applications
    /administration
        /private
            /controllers
            /models
            /views
            configuration.php
        /public
            /ajax
            /fonts
            /icons
            /images
            /stylesheets
        index.php
    /website
        /private
            /controllers
            /models
            /views
            configuration.php
        /public
            /ajax
            /fonts
            /icons
            /images
            /stylesheets
        index.php
/backups
/library
    /helpers
        datetime.php
        text.php
    controller.php
    model.php

详情

  • /applications - 我已将管理功能与普通网站分开,并且我还将为管理部分使用不同的子域名。
  • /applications/app/private - 访问此文件夹被nginx阻止。
  • /applications/app/public - 如其名称所示,所有可见于网络的内容都在此处。
  • /applications/app/index.php - 每个网站的入口点。
  • /backups - 数据库备份。
  • /library - 基本控制器/模型存放位置。
  • /library/helpers - 所有辅助类都在此处,这样我就不需要将它们复制/粘贴到两个应用程序中。

主要问题

这种网站结构好吗?如果您做事情有所不同,您会怎么做?我可能会遇到什么问题?我是否漏掉了什么?

非常感谢您的帮助!

4个回答

8
MVC模式与应用程序的文件夹布局完全没有任何关系。无论您将所有文件放入一个文件夹中,还是像问题中所示的那样使用布局,都没有任何影响。这并不会使MVC变得更多或更少,因为MVC不是关于文件夹,而是关于将用户界面交互分成三个不同角色的操作

除非您遵循需要特定文件命名方案(如PEAR)的代码约定,否则对于您的应用程序来说,唯一重要的是Autoloader能够在运行时以某种方式找到文件。所以,如果您认为上述布局对您有利,请使用它。

Robert "Uncle Bob" Martin建议您的文件夹布局应表达应用程序的内容。:

你的架构应该告诉读者系统的情况,而不是告诉他们你在系统中使用的框架。如果您正在构建医疗保健系统,那么当新程序员查看源存储库时,他们的第一印象应该是:“哦,这是一种医疗保健系统。”这些新程序员应该能够了解系统的所有用例,但仍然不知道如何交付系统。他们可能会来找你说:“我们看到一些东西像是模型,但视图和控制器在哪里”,您应该说:“哦,那些是细节,暂时不需要关心,稍后我们会向您展示它们。”


1
我认为这基本上就是这样。固定的目录和包含命名方案是代替自动加载器使用的,而不是因为应用程序设计需要它。 - mario

2
我正在使用类似的结构(也是自制框架,但备份在webroot之外)。你可以在private文件夹中添加一个“form”文件夹。我使用这个方法来使控制器更易读。表单通常是一堆对象代码,将它们放在控制器中包含的外部文件中是个好主意。不要忘记从重写规则中排除公共文件夹,这样就没问题了。另一种解决方案是将index.php放在public文件夹中,并将该文件夹定义为nginx中的webroot。这可以防止远程访问所有其他文件(如备份文件),这些文件只应由框架使用。
/applications
    /administration
        /private
            /controllers
            /models
            /views
            configuration.php
        /public <---- Vhost WebRoot
            /ajax
            /fonts
            /icons
            /images
            /stylesheets
            index.php
    /website
        /private
            /controllers
            /models
            /views
            configuration.php
        /public <---- Vhost WebRoot
            /ajax
            /fonts
            /icons
            /images
            /stylesheets
            index.php
/backups
/library
    /helpers
        datetime.php
        text.php
    controller.php
    model.php

2

快速提示:我建议你避免使用公共/私人文件夹,因为实际上你会将自己限制在两个角色中。在这种情况下,ACL实现可能会很困难/混乱。


0

我猜管理和网站是网站的不同模块。

为什么你没有一个共享或核心模块文件夹。例如,你有一个名为“用户”的数据库模型和命名为createUser()、editUser()、listUsers()、changeRightsOfUser()等等的方法。有了这个结构,你需要为所有模块编写并抽象化这个模型。

你的控制器必须是唯一的,这没问题。但是模型可以对每个模块进行使用或扩展。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接