在没有前端控制器的遗留项目上实现动态php包含
在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')例如
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')
在每个文件或其他文件的开头?