PHP项目的文件夹结构

时间:2011-03-11 15:34:10

标签: php design-patterns

我决定从头开始完全重写我的旧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 个答案:

答案 0 :(得分:8)

MVC模式与应用程序的文件夹布局有绝对没有

无论是将所有文件放在一个文件夹中还是使用问题中显示的布局都是完全无关紧要的。它并没有从中获得更多或更少的MVC,因为MVC不是关于文件夹,而是关于splitting user interface interaction into three distinct roles

除非您遵循需要某种文件命名方案(如PEAR)的代码约定,否则对您的应用程序唯一重要的是您的Autoloader可以在运行时以某种方式找到文件。因此,如果你认为上面显示的布局对你有好处,那就去吧。

Robert "Uncle Bob" Martin suggests that your folder layout should express what the application is about.

  

您的架构应该告诉读者系统,而不是系统中使用的框架。如果您正在构建医疗保健系统,那么当新程序员查看源代码库时,他们的第一印象应该是:“哦,这是一个健康护理系统”。那些新程序员应该能够学习系统的所有用例,但仍然不知道如何交付系统。他们可能会来找你并说:“我们看到一些看起来像模特的东西,但是视图和控制器在哪里”,你应该说:“哦,那些细节不需要你关注你,我们以后会告诉你的。“

答案 1 :(得分:2)

我正在使用类似的结构(也使用自制框架,但是从webroot备份)。您可以在私人文件夹中添加“表单”文件夹。

我使用它来使控制器更具可读性。表格通常是目标代码的一面大墙。将它们放在控制器中包含的外部文件中是个好主意。

不要忘记从重写规则中排除公用文件夹,一切都应该是好的:)

另一个解决方案是将index.php放在公用文件夹中,并将此文件夹定义为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 :(得分:2)

快速注意:我会远离公共/私人文件夹,因为您基本上将自己锁定为两个角色。在这种情况下,ACL实现将很困难/困惑。

答案 3 :(得分:0)

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

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

你的控制器必须是唯一的,这很好。但是模型可以用于每个模块或可扩展。