重写使用 Composer 安装的库中的类的策略

2022-08-30 12:03:17

我正在使用Codeigniter和Composer。其中一个要求是PHPExcel。现在我需要更改其中一个类中的函数。最好的策略应该是什么?我是否应该更改供应商文件夹中的代码?如果是这样,如何在所有实例中维护更改?如果不是,我如何重写该特定类。虽然我提到PHPExcel,但我想要一个通用的解决方案。

我不确定这是否是这个问题的正确论坛。如果没有,我将删除它。如果需要更多详细信息,请告诉我。

谢谢。


答案 1

在 composer.json 中,在 [“autoload”][“psr-4”] 下,添加一个以命名空间作为键、路径作为值的条目:

{
     "autoload": {

         "psr-4": {

             "BuggyVendor\\Namespace\\": "myfixes/BuggyVendor/Namespace"
         }
     }
}

复制要在该路径下覆盖的文件(保留子命名空间目录结构)并在那里编辑它们。它们将优先于库包的原始“类路径”进行选择。以这种方式添加到 composer.json 的命名空间>路径映射似乎在必需包添加的映射之前被考虑。注意:我刚刚尝试过它并且它起作用了,尽管我不知道它是否是预期的功能或可能的问题。

编辑:找到了一个陷阱。有时,当您随后需要另一个带有 的软件包时,您将“丢失”覆盖。如果发生这种情况,您必须手动发出。这将恢复正确的自动加载顺序,以遵守您的覆盖。composer require vendor/packagecomposer dump-autoload


答案 2

将最后2行添加到我的部分对我有用,当我想覆盖目录中的一个文件时:autoloadcomposer.jsonvendors

"autoload": {        
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "exclude-from-classmap": ["vendor/somepackagehere/blah/Something.php"],
    "files": ["app/Overrides/Something.php"]
},

请记住,其中的命名空间需要与 中的原始命名空间匹配。app/Overrides/Something.phpvendor/somepackagehere/blah/Something.php

请记住在编辑 .composer dump-autoloadcomposer.json

文档: https://getcomposer.org/doc/04-schema.md#files


推荐