Shopware管理面板激活App时脚本创建规则不生效问题
Shopware管理面板激活App时规则自动创建失效原因
该问题由不同运行上下文的权限规则、数据校验标准不一致导致,两个激活场景的核心差异如下:
- 命令行执行
bin/console app:activate MY_APP时,脚本运行在CLI上下文,默认跳过App权限校验、且数据写入层的格式校验容错性更高,因此编写的upsert逻辑可以正常执行,规则能成功生成。 - 管理面板界面激活应用时,脚本运行在Administration的Web请求上下文,会触发两层拦截导致逻辑静默失败,且不会在前台抛出可见报错:
- 缺少必要的实体操作权限:没有在应用的
manifest.xml配置文件中声明rule实体的创建/更新权限、payment_method实体的读取权限,Web上下文下App脚本的所有实体读写操作都会经过权限校验,无对应权限时操作会被直接拦截丢弃。 - 时间字段格式不符合校验要求:代码中手动给
createdAt字段传入了Y/m/d H:i:s格式的时间,Web上下文下的API写入层要求时间字段必须使用ISO8601标准格式,格式不匹配会触发数据校验失败,中断整个写入流程。
- 缺少必要的实体操作权限:没有在应用的
修复方案
- 在应用的
manifest.xml中补全所需的权限声明,配置示例:
<permissions> <create>rule</create> <update>rule</update> <read>payment_method</read> </permissions>
- 调整Twig脚本逻辑,移除手动传入的非标准格式
createdAt字段(Shopware写入层会在该字段缺失时自动填充当前系统时间,可完全避免格式兼容问题),修正后的代码如下:
{% do services.writer.upsert('rule', [ { name: 'mycustomrule', priority: 0, conditions: [{ type: 'paymentMethod', value: { paymentMethodIds: [paymentMethodRepository.findByCashPayment().id], operator: '!=' } }] } ]) %}
特殊场景如果必须手动传入时间值,使用
"now"|date("c")生成符合标准的ISO8601格式时间即可,不要自定义时间格式字符串。
内容的提问来源于stack exchange,提问作者Glancu
相关产品推荐
相关产品推荐

