typo3 /class-alias-loader
修改composer类加载器以支持类别名,为包提供向后兼容性
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 <9
Replaces
README
简介
此composer包背后的想法是为希望重命名类但仍想与这些库的消费包保持一定时间兼容性的库提供向后兼容性。
它做什么?
它提供了一个额外的类加载器,当composer导出自加载信息时,通过重写vendor/autoload.php
文件来修改composer类加载器。这仅当任何由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
。这允许库供应商提供兼容性包,这些包提供此类别名以提供向后兼容性,但保持库对新的用户来说更干净(和更快)。
如果您希望您的应用程序在运行时添加别名映射,那么始终初始化别名加载器可能是有用的。因此,您可以在您的root composer.json
中设置以下选项
"extra": {
"typo3/class-alias-loader": {
"always-add-alias-loader": true
}
},
使用API
公共API非常简单,仅包含一个类,该类只有三个静态方法,其中TYPO3\ClassAliasLoader\ClassAliasMap::getClassNameForAlias
方法最为重要。如果您在应用程序中有处理字符串中类名的位置,并且希望提供向后兼容性,可以使用此类方法。API返回原始(新)类名(如果有),或者如果没有找到别名,则返回给定的类名。
其余的方法处理在运行时添加别名映射,这通常不建议这么做。
欢迎反馈
贡献
如果您愿意贡献,请提交一个常规的Pull Request。这个包相当小。唯一需要遵守的是遵循PSR-2编码标准,并为您添加或更改的功能添加一些测试。