Plugins Shopware 6-在插件卸载时删除自定义字段
我已经创建了一个自定义服务,它在插件安装期间在customer表单中创建自定义字段。激活插件时,服务将正确运行并执行所需功能Plugins Shopware 6-在插件卸载时删除自定义字段,plugins,service,shopware,Plugins,Service,Shopware,我已经创建了一个自定义服务,它在插件安装期间在customer表单中创建自定义字段。激活插件时,服务将正确运行并执行所需功能 public function activate(ActivateContext $context): void { ../ $customFieldSetService = $this->container->get('custom.service'); $customFieldSetService->extendCustomerField
public function activate(ActivateContext $context): void
{
../
$customFieldSetService = $this->container->get('custom.service');
$customFieldSetService->extendCustomerFields();
/..
}
卸载插件时,我收到错误消息:您请求了一个不存在的服务“custom.service”
service.xml:
如何在卸载功能中调用我自己的服务?您不能在卸载插件停用之前调用它。一旦它被停用,该插件中的所有服务都将从服务容器中删除,并且无法调用。您可以在卸载方法中直接创建服务的实例。我认为这是最好的解决方案。让我快速向您展示一个我们如何做到这一点的示例。 我想代码应该是自我解释的:)
谢谢你的帮助。我现在在结构上设置了卸载,如下所示。当然,我希望将影响我自己类中自定义字段的所有函数外包,但不幸的是,这似乎不可能。您可以。以我们的BlogPlugin更新方法为例:但根据Valerii的回答,在卸载过程中(在更新过程中,它可能会工作),似乎仍然存在无法使用服务容器的限制,对吧?在我的特殊情况下,创建类的新对象并将服务“custom_field_set.repository”作为构造函数的参数传递。但是,我认为更复杂的服务嵌套和依赖关系可能不容易在卸载功能中实现。
public function uninstall(UninstallContext $context): void
{
../
$customFieldSetService = $this->container->get('custom.service');
$customFieldSetService->deleteCustomerFields();
/..
}
public function uninstall(UninstallContext $uninstallContext): void
{
if ($uninstallContext->keepUserData()) {
parent::uninstall($uninstallContext);
return;
}
$this->removeCustomField($uninstallContext);
parent::uninstall($uninstallContext);
}
private function removeCustomField(UninstallContext $uninstallContext)
{
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
$fieldIds = $this->customFieldsExist($uninstallContext->getContext());
if ($fieldIds) {
$customFieldSetRepository->delete(array_values($fieldIds->getData()), $uninstallContext->getContext());
}
}
private function customFieldsExist(Context $context): ?IdSearchResult
{
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
$criteria = new Criteria();
$criteria->addFilter(new EqualsAnyFilter('name', ['your_custom_fieldset']));
$ids = $customFieldSetRepository->searchIds($criteria, $context);
return $ids->getTotal() > 0 ? $ids : null;
}