如何覆写CoreShop中AddressChoiceType的默认实现修改choice_label格式
CoreShop final类AddressChoiceType自定义choice_label实现方案
因为AddressChoiceType是final类无法继承,且直接修改vendor目录下的文件会在composer更新时被覆盖,推荐以下两种合规的实现方案,按优先级排序:
方案1:使用Symfony表单类型扩展(官方推荐最优方案)
CoreShop基于Symfony框架开发,你可以通过Symfony原生的表单类型扩展机制,在不修改原有类代码的前提下覆盖choice_label默认配置:
- 第一步:创建表单扩展类
在项目的src/Form/Extension目录下新建AddressChoiceTypeExtension.php,代码如下:
<?php namespace App\Form\Extension; use CoreShop\Bundle\CoreBundle\Form\Type\AddressChoiceType; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\OptionsResolver\OptionsResolver; class AddressChoiceTypeExtension extends AbstractTypeExtension { public function configureOptions(OptionsResolver $resolver): void { // 覆盖原有choice_label默认实现 $resolver->setDefault('choice_label', function ($address) { return sprintf('%s %s %s %s', $address->getPostcode(), $address->getCity(), $address->getStreet(), $address->getNumber()); }); } public static function getExtendedTypes(): iterable { return [AddressChoiceType::class]; } }
- 第二步:注册扩展(若项目未开启自动装配需手动配置)
如果你的项目没有开启Symfony服务自动装配,需要在config/services.yaml中添加如下配置:
services: App\Form\Extension\AddressChoiceTypeExtension: tags: - { name: form.type_extension, extended_type: CoreShop\Bundle\CoreBundle\Form\Type\AddressChoiceType }
配置完成后清理缓存即可生效,所有使用AddressChoiceType的地方都会自动使用新的choice_label规则。
方案2:Composer补丁方案(适合快速临时修改)
如果需要直接修改原类文件,可以通过composer补丁插件实现修改持久化,避免更新被覆盖:
- 执行命令安装补丁插件:
composer require cweagans/composer-patches - 复制一份
vendor/coreshop/core-shop/src/CoreShop/Bundle/CoreBundle/Form/Type/AddressChoiceType.php修改第81行代码后,生成差异补丁文件存放在项目patches/address-choice-label.patch路径 - 在项目根目录的
composer.json中添加补丁配置:
{ "extra": { "patches": { "coreshop/core-shop": { "自定义地址选择器显示规则": "patches/address-choice-label.patch" } } } }
执行composer install会自动应用补丁,后续更新CoreShop版本时如果原文件没有变动,补丁会持续生效,若原文件有修改则需要重新生成补丁。
注意:禁止直接修改vendor目录下的文件,该修改无法持久化,composer执行install/update操作时会被完全覆盖。
内容的提问来源于stack exchange,提问作者Taras
相关产品推荐
相关产品推荐

