如何在具有自动加载功能的项目中开始使用composer


how to start using composer at a project that has autoload function?

我有一个项目是用我的团队当时编写的"私有框架"开发的,没有名称空间。所述框架依赖于自动加载功能,该功能包括框架内的文件并自动查找项目内的文件,这意味着在项目内我们有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