覆盖与 Composer 一起安装的库中的类的策略 [英] Strategy to override a class in a library installed with Composer

查看:28
本文介绍了覆盖与 Composer 一起安装的库中的类的策略的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using Codeigniter and Composer. One of the requirements is PHPExcel. Now I need to change a function in one of the classes. What should be the best strategy to do it? Should I change the code in the vendor folder? If so, how to maintain the change across all the instances? If not how do I override that particular class. Though I mention PHPExcel I would like a generic solution.

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

I am not sure if this is the right forum for this question. If not i will remove this. Please let me know if any more details are needed.

谢谢.

推荐答案

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

In composer.json, under ["autoload"]["psr-4"], add an entry with namespace as the key and path as the value:

{
     "autoload": {

         "psr-4": {

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

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

Copy files you want to override under that path (keeping sub-namespace directory structure) and edit them there. They will be picked in preference to the library package's original "classpath". It would seem that namespace->path mappings added to composer.json in this manner are considered before those added by required packages. Note: I just tried it and it worked, though I don't know if it is an intended feature or what possible gotchas are.

发现了一个问题.有时,当您随后使用 composer require vendor/package 需要另一个包时,您将丢失"覆盖.如果发生这种情况,您必须手动发出 composer dump-autoload.这将恢复正确的自动加载顺序以尊重您的覆盖.

found a gotcha. Sometimes when you subsequently require another package with composer require vendor/package, you will "lose" the override. If this happens, you must issue composer dump-autoload manually. This will restore the correct autoload order honoring your override.

这篇关于覆盖与 Composer 一起安装的库中的类的策略的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆