在没有前端控制器的遗留项目上实现动态php包含

在没有前端控制器的遗留项目上实现动态php包含,php,include,include-path,require-once,Php,Include,Include Path,Require Once,在php中,通过Includes/require_onces进行依赖关系管理是一件痛苦的事情。每隔一段时间,我就会改变一些东西,这些东西就会中断,我必须重新考虑在php中初始化第一个include()/require()的方法。我觉得我错过了一个更强大的技术,可以解决我所有的问题,但我只是似乎还没有找到它 用mvc自动加载会很好!但对于遗留程序项目,我不认为这有什么帮助 过去的做法 可能和其他人一样,我从相对路径开始require_once('../../../core/core.php')例如

在php中,通过
Include
s/
require_once
s进行依赖关系管理是一件痛苦的事情。每隔一段时间,我就会改变一些东西,这些东西就会中断,我必须重新考虑在php中初始化第一个include()/require()的方法。我觉得我错过了一个更强大的技术,可以解决我所有的问题,但我只是似乎还没有找到它

用mvc自动加载会很好!但对于遗留程序项目,我不认为这有什么帮助

过去的做法 可能和其他人一样,我从相对路径开始
require_once('../../../core/core.php')例如。不幸的是,当您开始需要具有自己所需依赖项的库时,这种情况就会中断。因此,我转而使用动态include从层次结构上的任何位置解析出主项目文件夹:
require_一次(substr(dirname(_文件),0,strpos(dirname(_文件),“my_项目”)+8.“core/database/admin.database.connection.php”)这意味着我可以在适当的地方通过权限,并将其移动到项目中的任何地方,它仍然可以工作!。不幸的是,当我实现CI时,它崩溃了,CI项目设置了一个项目根目录,如:
/home/rof/bitbucket.org/repo\u name/clone/
,它没有包含特定的字符串“my\u project”,因此破坏了所有的包含。所以在过去的一个多小时里,我一直在修复包含的内容,这一点都不好玩。我想找到一个“最终解决方案”

当前使用 目前,我已将“包含”更改为:

require_once(realpath(__DIR__.'/../../').'/core/database/admin.database.connection.php');
不幸的是,如果我将一组脚本向上或向下移动到一个目录中(比如将users/orders/移动到admin/orders或所有各种内务管理方法中),则需要重新编写每个脚本。将目录'/../../'更改为目录'/../../../'或任何内容。它很糟糕,因为它太复杂了,以至于试图在项目或目录范围内重写它是很可怕的,这些东西很可能就坏了

我的目标
  • 首先,我想设置include并确保它们 工作&忘掉他们
  • 第二层系统,使不同区域 可以包括具有不同访问级别的库
  • 第三,当事情发生变化时,我不想重写。理想情况下,我很乐意 在一个地方为管理员访问写include,在一个地方为用户访问写include 通道,以及一个公共通道
对于具有复杂目录结构的非面向对象、基于过程/函数的php项目,最终的解决方案是什么

示例目录结构和脚本 下面是一个近乎真实的目录结构,这是一个相当标准的结构,但只是让您了解一下:

core/
 - core.php
 - environment.php
 - database/
   - database.php
   - admin.database.connection.php
   - user.database.connection.php
   - public.database.connection.php
www/
 - index.php
 - contactus.php
 - map.php
 - ...
 - users/
   - login.php
   - logout.php
   - accountdetails.php
   - ...
 - admin/
   - login.php
   - logout.php
   - index.php
   - admin.php
   ...
   - reports/
     - revenue_report.php
     - orders.php
     - clientslist.php
   - orders/
     - orderslist.php
     - orderview.php
     ...

希望您能理解,这是一个旧的遗留系统,具有过程代码、许多复杂的脚本和多个数据库访问层。

无论过程设计如何,您都必须拥有一些公共文件,例如带有数据库连接信息的
config.php

因此,您可以在其中设置一些定义:

首先,你的应用程序的基本路径,相对于配置文件

define('APPLICATION_PATH',realpath(dirname(u FILE_u)。'/../');//或其他任何内容

注意,由于PHP5.3,您可以使用
\uuuuu DIR\uuuu
而不是
dirname(\uuuu FILE\uuuuu)

然后,您可以为每组文件设置单独的定义。可能:

define('CORE\u PATH',APPLICATION\u PATH./CORE/');

然后,在您的个人脚本中,您可以只执行以下操作

include(核心路径。'database/admin.database.connection.php');

或者,如果您想对其进行微调,请为
/core/database/
定义一个路径,例如
包含(core\u database\u path.'/admin.database.connection.php');


如果你移动这些文件夹,你只需要更新你的配置文件。

我现在已经处理了很多此类问题,以下是我在所有情况下强烈建议的:尽快通过前端控制器路由所有内容!

在php中,创建一个前端控制器并通过它处理所有脚本是非常有益的,只要您能够设置它。如果您仍然有像
example.php
,让您的前端控制器
index.php
以白名单的方式包含它们!因此像mydomain.com/example这样的url将通过前端-控制器,获取所有基本包含,然后才包括
example.php
脚本(如果已列入白名单)


其他任何事情都只是延迟了统一一个分裂的代码库不可避免的问题,这个代码库中充满了许多微小的分离脚本。

当然,我确实为各种事情定义了路径配置,但它们只有在第一次包含在任何脚本中之后才可用,这就是问题所在。我将在我的问题中澄清。啊,那么也许你可以使用uti在初始include路径中lise$\u SERVER['DOCUMENT\u ROOT']例如,
include($\u SERVER['DOCUMENT\u ROOT']./../config.php')
在每个文件或其他文件的开头?