PHP如何修改vendor中的代码

627 阅读1分钟

场景

相信做php开发的小伙伴都会遇到这样的情况,使用第三方的包时会遇到各种bug,官方又没来得及更新修复的,特别是大版本升级的时候最常见,又或者项目有需求需要改到包的代码的情况。

实例

1.用thinkphp6为例

在项目目录中创建一个文件夹名为 patch 然后创建一个文件名为 Autoload.php

代码为 以PhpAmqpLib\Connection\AbstractConnection 为例

<?php
/**
 * 加载器,将需要改进的composer库需要修改的类放在此处加载
 */
spl_autoload_register(function ($cls) {
    $map = [
        'PhpAmqpLib\Connection\AbstractConnection' => __DIR__ . '/AbstractConnection.php', // 修复PhpAmqpLib 8.1的问题
        // ....更多要修改的类
    ];

    if (isset($map[$cls])) {
        include $map[$cls];
        return true;
    }
}, true, true);

patch目录下创建AbstractConnection.php文件,复制PhpAmqpLib\Connection\AbstractConnection过来,最后根据自身需求修改即可。

还差一步即可大功告成,在项目根目录中找到composer.json文件,找到autoload,然后再files中填上前面Autoload.php的相对路径

"autoload": {
    "psr-4": {
        "app\\": "app"
    },
    "psr-0": {
        "": "extend/"
    },
    "files": [
        "patch/Autoload.php"
    ]
}

总结

这样就可以很好统一管理自己需要修改的包代码,同时又不用影响包原本的代码,提交代码的时候更不用把vendor的代码都提到仓库管理中。