helhum / class-alias-loader
Requires
- php: >=5.3.7
- composer-plugin-api: ^1.0 || ^2.0
Requires (Dev)
- composer/composer: ^1.1@dev || ^2.0@dev
- mikey179/vfsstream: ~1.4.0@dev
- phpunit/phpunit: >4.8 <8
Replaces
README
简介
此 composer 包背后的想法是为希望重命名类但仍然想在一定时间内与这些库的消费包保持兼容性的库提供向后兼容性。
功能
它提供了一个额外的类加载器,当 composer 输出自动加载信息时,通过重写 vendor/autoload.php
文件来修改 composer 类加载器。这仅在安装的任何包提供了配置在相应的 composer.json
中的类别名映射文件时才会执行。
工作原理
如果一个包提供了一个包含从旧类名到新类名的映射的映射文件,类加载器会注册自己并透明地调用 class_alias()
对有别名的类。如果请求旧类名,则加载原始类并建立别名,这样第三方包就可以透明地使用旧类名。
在 composer.json 中的配置
您可以在 composer.json
的 extra 部分中定义多个类别名映射文件,如下所示
"extra": {
"typo3/class-alias-loader": {
"class-alias-maps": [
"Migrations/Code/ClassAliasMap.php"
]
}
},
目前这些文件必须是 PHP 文件,返回一个关联数组,键是旧类名,值是新类名。这样的映射文件可以看起来像这样
<?php
return array(
'Tx_About_Controller_AboutController' => \TYPO3\CMS\About\Controller\AboutController::class,
'Tx_About_Domain_Model_Extension' => \TYPO3\CMS\About\Domain\Model\Extension::class,
'Tx_About_Domain_Repository_ExtensionRepository' => \TYPO3\CMS\About\Domain\Repository\ExtensionRepository::class,
'Tx_Aboutmodules_Controller_ModulesController' => \TYPO3\CMS\Aboutmodules\Controller\ModulesController::class,
);
PHP 5.5 之前不存在 '::class' 常量。在 PHP 5.5 之前,映射文件可以看起来像这样
<?php
return array(
'Tx_About_Controller_AboutController' => 'TYPO3\\CMS\\About\\Controller\\AboutController',
'Tx_About_Domain_Model_Extension' => 'TYPO3\\CMS\\About\\Domain\\Model\\Extension',
'Tx_About_Domain_Repository_ExtensionRepository' => 'TYPO3\\CMS\\About\\Domain\\Repository\\ExtensionRepository',
'Tx_Aboutmodules_Controller_ModulesController' => 'TYPO3\\CMS\\Aboutmodules\\Controller\\ModulesController',
);
在您的 root composer.json
文件中,您可以决定是否允许使用错误的拼写找到类。由于 PHP 对于类名不区分大小写,但 PSR 类加载标准将文件名绑定到类名,实际上类名是区分大小写的。但是,对于旧包,允许即使提供错误的拼写也加载类名可能很有用。为了正确工作,您需要使用 composer 优化类加载信息功能。
您可以通过以下方式激活此功能
"extra": {
"typo3/class-alias-loader": {
"autoload-case-sensitivity": false
}
},
此选项的默认值是 true
。
如果没有找到别名映射并且大小写敏感设置为 true
,则默认情况下此包不执行任何操作。这意味着不会输出额外的类加载信息,并且不会更改 vendor/autoload.php
。这使库供应商能够提供兼容性包,这些包提供此类别名以提供向后兼容性,同时保持库对新的用户更干净(并且更快)。
如果您希望在应用程序运行时添加别名映射,那么始终初始化别名加载器可能很有用。因此,您可以在您的 根目录 下的 composer.json
中设置以下选项
"extra": {
"typo3/class-alias-loader": {
"always-add-alias-loader": true
}
},
使用API
公共API非常简单,仅由一个类组成,该类只有一个静态方法,其中 TYPO3\ClassAliasLoader\ClassAliasMap::getClassNameForAlias
是最重要的一个。如果您在应用程序中有处理字符串中类名的地方,并且想要提供向后兼容性,则可以使用此类方法。API返回原始(新)类名(如果存在),或者如果没有找到别名,则返回给定的类名。
其余的方法处理在运行时添加别名映射,这通常不推荐。
欢迎反馈
贡献
如果您想贡献,请提交一个常规的 拉取请求。这个包非常小。唯一需要尊重的是遵循 PSR-2 编码标准,并为您添加或更改的功能添加一些测试。