Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP项目的文件夹结构_Php_Design Patterns - Fatal编程技术网

PHP项目的文件夹结构

PHP项目的文件夹结构,php,design-patterns,Php,Design Patterns,我决定从头开始完全重写我的旧PHP项目。以前,我每个页面都有一个文件,现在我想用MVC模式方法代替一个入口点。这个项目本身相当大,我正在尝试构建自己的框架,以便能够很好地集成所有内容 我在stackoverflow上搜索过类似的问题,发现了一些,但它们的文件夹结构完全不同,所以我决定发布自己的问题 迄今为止的文件夹结构 细节 /applications-我已经将管理与普通网站分开,并且我还将使用不同的子域进行管理 /applications/app/private-nginx已阻止对此文件夹的

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

我在stackoverflow上搜索过类似的问题,发现了一些,但它们的文件夹结构完全不同,所以我决定发布自己的问题

迄今为止的文件夹结构 细节
  • /applications-我已经将管理与普通网站分开,并且我还将使用不同的子域进行管理
  • /applications/app/private-nginx已阻止对此文件夹的访问
  • /applications/app/public-顾名思义,网络上所有可见的东西
  • /applications/app/index.php-每个网站的入口点
  • /backups-数据库备份
  • /library-基本控制器/模型位于此处
  • /library/helpers-将在两个网站中使用的所有帮助程序类都在这里,因此我不需要将它们复制/粘贴到两个应用程序中
主要问题 这是构建我的网站的好方法,还是你会采取不同的做法?这种结构是否存在任何缺陷?我有什么遗漏吗


非常感谢您的帮助

我使用的是类似的结构(也有自制的框架,但从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
/应用程序
/管理
/私人的
/控制器
/模型
/观点
configuration.php

/公共我猜管理和网站是网站的不同模块

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


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

MVC模式与应用程序的文件夹布局完全无关

无论您是将所有文件放在一个文件夹中,还是使用问题中所示的布局,都是完全无关的。它并没有从中获得多少MVC,因为MVC不是关于文件夹,而是关于

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

:

您的体系结构应该告诉读者有关系统的信息,而不是您在系统中使用的框架。如果您正在构建一个医疗保健系统,那么当新程序员查看源代码库时,他们的第一印象应该是:“哦,这是一个医疗保健系统”。这些新程序员应该能够学习系统的所有用例,但仍然不知道系统是如何交付的。他们可能会对你说:“我们看到一些看起来有点像模型的东西,但是视图和控制器在哪里呢?”你应该说:“哦,这些都是你目前不需要关心的细节,我们稍后会向你展示。”


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

我想这差不多就是总结。使用固定目录和包含命名方案代替自动加载器,并不是因为应用程序设计需要它。
/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