如何使用composer生成的类映射添加不区分大小写的自动加载?

时间:2013-11-27 07:02:25

标签: php composer-php autoload

我有遗留项目,在不同情况下有声明和类使用。

我想升级源到现代状态。首先,我想用作曲家自动加载替换传统的自动加载。但作曲家不提供case insensitive autoloading

如何使用composer classmap和不敏感的自动加载?

3 个答案:

答案 0 :(得分:5)

classmap添加到composer.json

"autoload": {
    "classmap": ["folder1/", "folder2/"]
},

然后运行composer.phar dumpautoload以创建composer/autoload_classmap.php

更改您的代码。之后

require VENDOR_PATH . '/autoload.php';

添加

$class_map = require VENDOR_PATH . '/composer/autoload_classmap.php';
$new_class_map = array();
foreach ($class_map as $class => $file)
    $new_class_map [strtolower($class)] = $file;
unset($class_map);
spl_autoload_register(function ($class)use($new_class_map)
        {
        $class = strtolower($class);
        if (isset($new_class_map[$class]))
            {
            require_once $new_class_map[$class];
            return true;
            }
        else
            return false;
        }, true, false);
unset($new_class_map);

这是我找到的最简单的方法。

答案 1 :(得分:2)

你没有 - 与作曲家。

修复代码。即使用Composer创建类的类映射,然后对所有这些类名进行不区分大小写的搜索,并使用类映射中的正确区分大小写的版本替换它们。

或者创建你自己的不区分大小写的类映射加载器,如果它使用不正确的情况对类名进行捣乱并且让你逐个修复软件就会自动抱怨 - 有丢失某些情况的危险,只有在代码更改后才能检测到重新排列自动加载类的顺序。

答案 2 :(得分:0)

如果您的生产设置支持spl_autoload_register(从5.1.2开始) - 您可以将自己的自动加载实现与作曲家一起添加。我在这里是如何完成的(它还依赖于名称间距):

autoload.php

<?php
spl_autoload_register('classLoader');

function classLoader($className, $prefix = '') {
  $pathParts = explode('\\', $className);
  $newPathParts = array_map('strtolower', $pathParts);
  $classPath = $prefix . implode(DIRECTORY_SEPARATOR, $newPathParts) . '.php';

  if ( file_exists($classPath) ) {
    require_once $classPath;
  }
}

?>

在您的文件中,您可以根据自己的喜好混合使用。

$obj = new View\Home\Home();

与:

相同
$obj = new vIEw\home\homE();