如何使用作曲家生成的类图添加不区分大小写的自动加载?

Posted

技术标签:

【中文标题】如何使用作曲家生成的类图添加不区分大小写的自动加载?【英文标题】:How to add case insensitive autoloading using composer generated classmap? 【发布时间】:2013-12-12 17:00:10 【问题描述】:

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

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

如何使用composer classmap和insensitive autoload?

【问题讨论】:

【参考方案1】:

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);

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

【讨论】:

【参考方案2】:

你没有 - 与作曲家。

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

或者创建你自己的不区分大小写的类映射加载器,如果它偶然发现一个带有不正确大小写的类名,它会自动抱怨,并让你一个一个地修复软件 - 有丢失某些情况的危险,这些情况只有在代码更改后才会被检测到重新排列自动加载的类的顺序。

【讨论】:

一次重写整个代码是一个很好的解决方案。但我喜欢可行的小改动。 使类名的使用保持一致,一次一个。 Composer 将帮助您检测要使用的名称。 我会做的。但是遗留代码可能包含缺陷:生成的类名,不能只是重命名。【参考方案3】:

如果您的生产设置支持 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();

【讨论】:

以上是关于如何使用作曲家生成的类图添加不区分大小写的自动加载?的主要内容,如果未能解决你的问题,请参考以下文章

我已经做了一个自动加载转储来重建我的类图

如何在 laravel 中要求作曲家自动加载器?

如何在 MySQL 中使用 JPA 自动生成区分大小写的列

laravel 5.2 中的作曲家更新

PHP使用来自作曲家的自动加载器添加自定义命名空间

Composer 自动加载始终是第一位的