Shopware 6插件更新后配置值错误:旧配置键移除引发的迁移问题
解决Shopware 6插件评论配置迁移重复覆盖问题
针对你遇到的reviewModeration到autoPublishStars配置迁移时的重复覆盖问题,核心解决方案是添加迁移完成标记,确保配置映射只执行一次,同时兼容跨版本直接更新的场景。
实现思路
- 新增一个迁移标记配置项(比如
reviewConfigMigrated),用来记录是否已经完成旧配置到新配置的迁移 - 仅当旧配置
reviewModeration存在且迁移标记未设置时,才执行值映射逻辑 - 在目标版本≥1.6.4时,统一移除旧配置键,避免后续干扰
具体代码实现
在插件的update方法中修改逻辑如下:
use Shopware\Core\System\SystemConfig\SystemConfigService; use Shopware\Core\Framework\Plugin\Context\UpdateContext; public function update(UpdateContext $context): void { parent::update($context); $configService = $this->container->get(SystemConfigService::class); $targetVersion = $this->getVersion(); // 配置键与迁移标记定义 $oldConfigKey = 'reviewModeration'; $newConfigKey = 'autoPublishStars'; $migratedFlag = 'reviewConfigMigrated'; // 获取旧配置值与迁移状态 $oldModerationValue = $configService->get($oldConfigKey, $context->getContext()); $hasMigrated = $configService->get($migratedFlag, $context->getContext()); // 仅在未迁移且旧配置存在时执行映射 if ($oldModerationValue !== null && !$hasMigrated) { // 根据业务逻辑映射旧值到新配置:示例中true对应自动发布所有评论,false对应不自动发布 $newPublishValue = $oldModerationValue ? 'All' : 'None'; $configService->set($newConfigKey, $newPublishValue, $context->getContext()); // 设置迁移标记,防止后续更新重复执行 $configService->set($migratedFlag, true, $context->getContext()); } // 1.6.4及以上版本删除旧配置键 if (version_compare($targetVersion, '1.6.4', '>=')) { $configService->delete($oldConfigKey, $context->getContext()); } }
关键细节说明
- 迁移标记的作用:无论用户是逐步更新(1.6.2→1.6.3→1.6.4)还是跨版本直接更新(1.6.2→1.6.4),只要标记已设置,就不会再触发迁移逻辑,避免覆盖已有的
autoPublishStars值 - 跨版本兼容:直接从低版本升级到1.6.4时,旧配置
reviewModeration还存在,会正常执行迁移后再删除旧键 - 值映射调整:根据你的实际业务调整
$newPublishValue的映射规则,比如原reviewModeration=true可能对应其他星级规则,自行修改即可
测试场景验证
- 测试1:1.6.2→1.6.3→1.6.4:迁移仅在1.6.2→1.6.3时执行,后续更新不会修改
autoPublishStars - 测试2:1.6.2→1.6.4:直接完成迁移并删除旧配置,
autoPublishStars保留正确映射值
内容的提问来源于stack exchange,提问作者mlodhi
相关产品推荐
相关产品推荐

