怎么替换vendor中的代码?

dcat-admin 中扩展版本的代码不兼容php 8.3.2

   //文件  Dcat\Admin\Extend\VersionManager;
    public function getNewFileVersions($name, $version = null)
    {
        $name = $this->manager->getName($name);

        if ($version === null) {
            $version = static::NO_VERSION_VALUE;
        }

        $versions = $this->getFileVersions($name);

        $position = array_search($version, array_keys($versions));

        if ($position === false) {
            return $versions;
        }
        // $position++ 不兼容php8.3.2
        return array_slice($versions, $position++);
    }

这个是dcat-admin 扩展的代码,正常情况是将dcat-admin 自己打一个composer包,在自己的composer 包上面修改,有点麻烦,有没有直接在项目中代码中替换这个方法的方案?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

file 在 composer.json,autoload 下加 classmap。 将修改后的文件路径写入其中。后运行 composer install。

2个月前 评论
讨论数量: 12

在 composer.json 中添加一个钩子脚本,在每次加载 Composer 的自动加载器时运行。可以用来修改文件内容。例如:

"scripts": {
    "post-autoload-dump": [
        "php scripts/patch-vendor.php"
    ]
}

创建 scripts/patch-vendor.php,用 PHP 代码自动替换目标行:

<?php

$file = __DIR__ . '/../vendor/target/package/target-file.php';
$content = file_get_contents($file);

// 替换目标代码
$updatedContent = str_replace('旧代码', '新代码', $content);
file_put_contents($file, $updatedContent);

echo "Patched $file\n";

每次运行 composer install
或 composer update 后会自动应用修改。

2个月前 评论

不用那么麻烦,因为 PHP 中对于类定义来说,就是先到先得原则,换句话说,你只要把这个文件拷贝出来到自己的项目下,然后修改代码,最后在入口,比如 index.php 中 require 就好了。

当然,代价就是,你的关注一下更新,所以更建议给仓库提 PR。

2个月前 评论

在 composer.json 中添加一个钩子脚本,在每次加载 Composer 的自动加载器时运行。可以用来修改文件内容。例如:

"scripts": {
    "post-autoload-dump": [
        "php scripts/patch-vendor.php"
    ]
}

创建 scripts/patch-vendor.php,用 PHP 代码自动替换目标行:

<?php

$file = __DIR__ . '/../vendor/target/package/target-file.php';
$content = file_get_contents($file);

// 替换目标代码
$updatedContent = str_replace('旧代码', '新代码', $content);
file_put_contents($file, $updatedContent);

echo "Patched $file\n";

每次运行 composer install
或 composer update 后会自动应用修改。

2个月前 评论

自己写个类继承他,然后用composer引入,你用新的类就行了

2个月前 评论

感觉可以在自己的项目目录下写一个类,继承这个类,然后重写这个方法,想办法将自定义的类加载到对应的框架或者对象中去

2个月前 评论

composer有那个classmap可以实现 每次autoload时用你的文件替换vendor的某一个文件。

2个月前 评论

file 在 composer.json,autoload 下加 classmap。 将修改后的文件路径写入其中。后运行 composer install。

2个月前 评论

还好hyperf有个class map :heart_eyes:

2个月前 评论
errbool 2个月前

fork仓库,修改代码,composer 依赖改成fork的仓库

2个月前 评论
    "autoload": {
        "files": [
            "overwriteclass/phinx/Util.php",
            "overwriteclass/phinx/MysqlAdapter.php",
            "overwriteclass/phinx/AdapterFactory.php",
            "overwriteclass/think/queue/Listener.php"
        ]
    }
composer dump-autoload
1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!