作为 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 文件夹中。

  1. 现在创建覆盖文件夹。
  2. 从要覆盖的包中复制粘贴所有文件。
  3. 根据您的需要更改文件。
  4. 在 composer.json 中添加以上行
  5. 运行命令“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。


最后更新于 2021年11月22日

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