Shopware 6 - 删除插件卸载时的自定义字段

rea*_*enx 3 service plugins shopware

我创建了一项自定义服务,该服务在插件安装期间在客户表单中创建自定义字段。激活插件时,服务正确运行并执行所需的功能。

public function activate(ActivateContext $context): void
{
  ../
  $customFieldSetService = $this->container->get('custom.service');
  $customFieldSetService->extendCustomerFields();
  /..
}
Run Code Online (Sandbox Code Playgroud)

卸载插件时,我收到错误消息:您请求了一个不存在的服务“custom.service”。

public function uninstall(UninstallContext $context): void
{
 ../
  $customFieldSetService = $this->container->get('custom.service');
  $customFieldSetService->deleteCustomerFields();
 /..
}
Run Code Online (Sandbox Code Playgroud)

服务.xml:

<service id="custom.service" class="MyPlugin\Service\CustomFieldSetService" public="true" />

如何在卸载功能中调用我自己的服务?

Chr*_*sin 7

让我快速向您展示我们如何做的一个例子。我想代码应该是不言自明的:)

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;
    }

Run Code Online (Sandbox Code Playgroud)