Symfony - 如何覆盖不在捆绑包中的供应商组件

Posted

技术标签:

【中文标题】Symfony - 如何覆盖不在捆绑包中的供应商组件【英文标题】:Symfony - How to override a vendor component which is not in a bundle 【发布时间】:2018-05-04 00:11:59 【问题描述】:

我正在搜索覆盖供应商目录中的文件 但不是捆绑包。 我正在使用 Symfony 2.7

更具体地说,我正在尝试覆盖此文件中的方法:

vendor/akeneo/pim-community-dev/src/Pim/Component/Catalog/Updater/ProductUpdater.php

我想在一个文件中这样做:

src/MyApp/Component/Catalog/Updater/ProductUpdater.php

我找到的所有文档都依赖于 Bundle 的一部分。 那么,是否有可能做到这一点? 如果是,怎么办?

最好的问候!

PS: 在回复之前,请考虑一下我是 Symfony 的菜鸟 :) 另外,你可能已经注意到我自己的应用里面有一个 Symfony 应用,这很正常,不用担心 :D

【问题讨论】:

这很正常,别担心 - 不,不是真的。听起来您想分叉该项目,而不是将其作为您自己的依赖项。 您的应用中如何使用该文件? 【参考方案1】:

有一种方法可以使用 composer 覆盖文件。

您可以在 autoload->psr-4 键下添加类似这样的 composer.json。

"autoload": 
        "psr-4": 
            "Pim\\Component\\Catalog\\Updater\\": "MyApp/Pim/Component/Catalog/Updater"
        ,

其中第一部分是您要覆盖的文件的命名空间,第二部分是新路径。

当您向 composer 添加新包时,这可能会产生一些问题,因此请确保您运行 composer dump-autoload 以重新创建自动加载顺序。

我不太喜欢这种方法,但它确实为我节省了几次从捆绑包中修复文件而无需实际分叉捆绑包的时间,如果没有其他帮助,我可以将其用作最后的手段。

更多关于作曲家自动加载在这里

https://getcomposer.org/doc/01-basic-usage.md#autoloading

希望这会有所帮助,

亚历山德鲁·科索伊

【讨论】:

它似乎不起作用,我想我做错了什么。我将此添加到我的composer.json:“psr-4”:“Pim\\Component\\Catalog\\Updater\\ProductUpdater\\”:“src/MyApp/Bundle/QuantityPackBundle/Updater/ProductUpdater.php”我也尝试使用“src/MyApp/Bundle/QuantityPackBundle/Updater/”作为覆盖的路径,但它也不起作用。 我必须准确地说我还清除了缓存等... :) 您在 composer dump-autoload 上遇到错误吗? Pim\\Component\\Catalog\\Updater\\ProductUpdater\\ 也是您要覆盖的类的正确命名空间吗?还要确保 src/MyApp/Bundle/QuantityPackBundle/Updater/ProductUpdater.‌​php 使用了您要覆盖的旧命名空间

以上是关于Symfony - 如何覆盖不在捆绑包中的供应商组件的主要内容,如果未能解决你的问题,请参考以下文章

Symfony services.yaml来自供应商捆绑包的绑定参数

删除捆绑包后的 symfony 致命错误

Symfony 2.x 中的所有东西都应该是一个捆绑包吗?

在 Symfony2 中使用同一个包中的两个实体管理器

在运行时替换捆绑包中的图像

如何覆盖 FOS 用户捆绑表单标签