作为 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。
最后更新于 2021年11月22日