php

laravel 如何覆盖composer的 vendor类文件?

dafenqi
2023-08-12 / 0 评论 / 19 阅读 / 正在检测是否收录...

laravel 如何覆盖composer的 vendor类文件?

作为 Laravel 开发人员,你可能遇到过这样的情况:你不喜欢 vendor 文件夹某个包中的某些代码,并且想要更改它。你可以直接在该文件中更改它。但问题是当你点击composer update命令升级包时很容易覆盖已修改的vendor类文件。
那么有什么解决办法呢?
感谢Composer,它具有覆盖任何包/类的功能。Composer 使用PSR-4来加载类。因此,在 composer.json 中,你可以提及从哪些文件或文件夹加载类。同样你也可以排除加载它。

操作步骤:
windows用户
排除文件
请参考下面的示例以了解我如何从包tymon/jwt-auth 中排除 1个文件

"exclude-from-classmap": ["vendor\tymon\jwt-auth\src\Middleware\BaseMiddleware.php"],
在上面的例子中可以看出我已经排除了BaseMiddleware.php文件。你必须将此行放在composer.json的autoload段中。这里要注意的一件事是,我在路径中有双反斜杠,那是因为在 Windows 机器上,并且因为它是 JSON 文件,所以我必须在那里转义 () ,即写上双反斜杠。

包含文件以覆盖vendor
现在我们已经排除了我们想要覆盖的文件,现在需要包含有更改的新文件,以便 composer 知道要包含哪些文件。

为此,向 composer.json 中的 'psr-4' 键添加另一个键值对,如下所示:

"autoload": {

    "psr-4": {
        "App\\": "app/",
        "Tymon\\": "app/Overrides/"
    },
    "exclude-from-classmap": [
        "vendor\\tymon\\jwt-auth\\src\\Middleware\\BaseMiddleware.php"
    ]
},

添加了上面代码中的"Tymon\": "app/overrides",以指示comopser将文件包含在 app/overrides 文件夹中。

现在创建覆盖文件夹。
从要覆盖的包中复制粘贴所有文件。
根据您的需要更改文件。
在 composer.json 中添加以上行
运行命令“composer dump-autoload”(不带引号)
上面的命令将刷新所有自动加载文件以包含您的新文件。请记住,无论何时更改 composer.json 文件中的任何内容,您都需要触发上述5的命令以反映更改。

对于Unix/Linux用户
Linux 用户的说明是相同的,只是代码会改变,我在下面提到。按照与上述 Windows 用户相同的说明进行操作。

排除文件
如果您在 Linux/Unix 机器上,路径将如下所示:

"exclude-from-classmap": ["vendor/tymon/jwt-auth/src/Middleware/BaseMiddleware.php"],

包含文件
"autoload": {

    "psr-4": {
        "App\\": "app/",
        "Tymon\\": "app/Overrides/" 
    },
    "exclude-from-classmap": [
        "vendor/tymon/jwt-auth/src/Middleware/BaseMiddleware.php"
    ]
},

Overrides 只是一个名字,你可以选择任何你喜欢的。重要的是提供它的 composer.json 文件的相对路径。

谢谢

以上在composer2.0下测试通过,

参考 https://shyammakwana.me/php/laravel-override-vendor-classes.html

0

Deprecated: strtolower(): Passing null to parameter #1 ($string) of type string is deprecated in /www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php on line 1032

评论 (0)

取消