重写使用 Composer 安装的库中的类的策略
我正在使用Codeigniter和Composer。其中一个要求是PHPExcel。现在我需要更改其中一个类中的函数。最好的策略应该是什么?我是否应该更改供应商文件夹中的代码?如果是这样,如何在所有实例中维护更改?如果不是,我如何重写该特定类。虽然我提到PHPExcel,但我想要一个通用的解决方案。
我不确定这是否是这个问题的正确论坛。如果没有,我将删除它。如果需要更多详细信息,请告诉我。
谢谢。
我正在使用Codeigniter和Composer。其中一个要求是PHPExcel。现在我需要更改其中一个类中的函数。最好的策略应该是什么?我是否应该更改供应商文件夹中的代码?如果是这样,如何在所有实例中维护更改?如果不是,我如何重写该特定类。虽然我提到PHPExcel,但我想要一个通用的解决方案。
我不确定这是否是这个问题的正确论坛。如果没有,我将删除它。如果需要更多详细信息,请告诉我。
谢谢。
在 composer.json 中,在 [“autoload”][“psr-4”] 下,添加一个以命名空间作为键、路径作为值的条目:
{
"autoload": {
"psr-4": {
"BuggyVendor\\Namespace\\": "myfixes/BuggyVendor/Namespace"
}
}
}
复制要在该路径下覆盖的文件(保留子命名空间目录结构)并在那里编辑它们。它们将优先于库包的原始“类路径”进行选择。以这种方式添加到 composer.json 的命名空间>路径映射似乎在必需包添加的映射之前被考虑。注意:我刚刚尝试过它并且它起作用了,尽管我不知道它是否是预期的功能或可能的问题。
编辑:找到了一个陷阱。有时,当您随后需要另一个带有 的软件包时,您将“丢失”覆盖。如果发生这种情况,您必须手动发出。这将恢复正确的自动加载顺序,以遵守您的覆盖。composer require vendor/package
composer dump-autoload
将最后2行添加到我的部分对我有用,当我想覆盖目录中的一个文件时:autoload
composer.json
vendors
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
},
"exclude-from-classmap": ["vendor/somepackagehere/blah/Something.php"],
"files": ["app/Overrides/Something.php"]
},
请记住,其中的命名空间需要与 中的原始命名空间匹配。app/Overrides/Something.php
vendor/somepackagehere/blah/Something.php
请记住在编辑 .composer dump-autoload
composer.json