我有一个项目是用我的团队当时编写的"私有框架"开发的,没有名称空间。所述框架依赖于自动加载功能,该功能包括框架内的文件并自动查找项目内的文件,这意味着在项目内我们有0 includes/requires。每个文件都遵循特定的规则,并由我的函数包含。
每次我们使用第三方库时,我们都会下载文件并将其放置在特定位置,然后加载files属性。
本周我发现了一个我想使用的新库,所以我决定通过composer安装它。现在,我的自动加载函数不存在了,我的框架在开始时会停止执行丢失的文件。
我如何保持我的自动加载原样(包括我的项目和框架中没有名称空间的文件)并仍然使用composer?有可能吗?或者我死了?
编辑:向问题添加一些文件。
frameworkBootstrap-这个文件加载框架(工作得很好)
<?php
$dir = dirname(__FILE__);
// Database Package
require $dir . '/nav/database/NavDao.php';
require $dir . '/nav/database/NavDatabase.php';
require $dir . '/nav/database/NavTable.php';
// General
require $dir . '/nav/general/NavLanguage.php';
require $dir . '/nav/general/NavProject.php';
require $dir . '/nav/general/NavController.php';
// Tool
require $dir . '/nav/tool/NavValidator.php';
require $dir . '/nav/tool/NavLogger.php';
require $dir . '/nav/tool/NavListener.php';
require $dir . '/nav/tool/NavFile.php';
require $dir . '/nav/tool/NavEmail.php';
require $dir . '/nav/tool/NavException.php';
// View
require $dir . '/nav/view/NavPage.php';
require $dir . '/nav/view/NavTemplate.php';
require $dir . '/nav/view/NavView.php';
// Request
require $dir . '/nav/request/NavRequest.php';
require $dir . '/nav/request/NavAccess.php';
require $dir . '/nav/request/NavResponse.php';
require $dir . '/nav/request/NavSession.php';
// Plugin
NavProject::plugin(
array(
'NavMail' => $dir . '/nav/plugin/email/NavMail.php',
'NavXPertMailer2006' => $dir . '/nav/plugin/email/NavXPertMailer2006.php',
'NavLog' => $dir . '/nav/plugin/log/NavLog.php',
'NavImage' => $dir . '/nav/plugin/file/NavImage.php',
'NavMysql' => $dir . '/nav/plugin/dbms/NavMysql.php',
'NavOracle' => $dir . '/nav/plugin/dbms/NavOracle.php',
'NavTranslate' => $dir . '/nav/plugin/translate/NavTranslate.php'
));
require $dir . '/vendor/autoload.php';
?>
自动加载功能-此功能正在被替换
function __autoload($className) {
$file = '';
// Auto Load Template
if (strpos($className, 'Template') !== false)
$file = NavProject::path() . 'class/view/template/' . $className . '.php';
// Auto Load Project Tools
else if (strpos(strtolower($className), strtolower(NavProject::name())) !== false)
$file = NavProject::path() . 'class/tool/' . $className . '.php';
// Auto Load Controllers
else if (strpos($className, 'Controller') !== false)
$file = NavProject::path() . 'class/control/' . $className . '.php';
// Auto Load Nav Plugin
else if (strpos($className, 'Nav') === 0) {
$list = NavProject::plugin();
foreach ($list as $plugin => $location)
if ($plugin == $className)
$file = $location;
// Auto Load Model
} else {
$file = NavProject::path() . 'class/model/' . $className . '.php';
}
if (is_file($file))
require $file;
}
第三方图书馆
https://github.com/alexshelkov/SimpleAcl
您应该走稍长的路线,用Composer的自动加载取代您自己的自动加载。
短期内,您将能够使用类映射功能自动加载所有现有代码:
"autoload": {
"classmap":
["class/view/template/","class/tool/","class/control/","class/model", "nav/"]
}
类映射应该包含您拥有类的每个目录,并且路径应该与您放置自己的composer.json
的顶级目录相对。
然后,您可以删除自己的__autoload
函数(只能定义一个函数,如果这样做,就不能同时让其他库自动加载——早在Composer使用"spl_autoload"功能之前,自动加载的方法就是删除框架引导程序中的每个require
语句,并将其替换为require "vendor/autoload.php";
。包含自动加载后,您可以访问自己代码的类映射中的每个类,以及添加的每个库。
您必须运行composer install
一次才能创建类映射。
如果在此之后创建新的类,则必须再次运行composer dump-autoload
来刷新映射。如果这让你很烦恼,可以考虑改用PSR-0自动加载。我认为这在您的代码库中已经是可行的,但在不知道类命名约定的情况下,我不愿意提出一些建议。
例如,自动加载器会假设任何名称中有"Template"的类都位于"class/view/Template"文件夹中。这包括TemplateHomepage
以及HomepageTemplate
以及PageTemplateHome
。您的自动加载器允许加载多个名称,但我想您只使用一个方案。
尝试用spl_autoload_register()替换__autoload;
为什么
不鼓励使用
__autoload();
,可能会在来自docs的未来。
此函数可能与作曲家使用的spl_autoload_register()
发生冲突。
spl_autoload_register('my_autoload', false, true);
然后将__autoload替换为my_autoload