【问题标题】:ApiPaltform - recover soft deleted elementApiPaltform - 恢复软删除的元素
【发布时间】:2020-12-18 10:39:12
【问题描述】:

我正在使用ApiPlatform 和Symfony5

我在实体 User 上实现了 softdelete

此实体已正确软删除,我仍想显示某些角色的已删除用户,因此我正在尝试使用DoctrineExtension 动态修改请求。

这是我的UserExtension.php:

    public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null, array $context = []): void
    {
        $this->addWhere($queryBuilder, $resourceClass);
    }

    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void
    {

        if (User::class == $resourceClass &&
            $this->security->isGranted(GenericRoles::ROLE_ADMIN)
        ) {
            $rootAlias = $queryBuilder->getRootAliases()[0];

            $queryBuilder->andWhere("$rootAlias.deletedAt > '2019-01-01'");
        }
    }

我验证我输入了 if 条件。

但我仍然在我正在尝试恢复的项目上收到 404(它仍在基础中)

在 db 命令行中输入的相同请求返回我想要恢复的项目。

我还尝试禁用softdelete,如下所示:

$this->entityManager->getFilters()->disable('softdeleteable');

但是这样做会为整个应用程序禁用它,我无法在 UserExtension 中重新启用它

有谁知道我做错了什么?或者如果有其他方法可以恢复软删除的项目

或者,如果您有更多关于该主题的文档,我将不胜感激,因为我已经没有选择了

谢谢!

【问题讨论】:

    标签: symfony doctrine api-platform.com soft-delete doctrine-extensions


    【解决方案1】:

    是的,这并不简单,因为您的查询在扩展程序之外执行。仅在经过身份验证的用户具有管理员角色的情况下,我可能会尝试禁用用户实体的软可删除过滤器。在执行查询后它仍然会被禁用,但它不应该造成太多的副作用,因为管理员用户应该能够看到已删除的用户实体。像这样。

    public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null, array $context = []): void
    {
        $this->addWhere($queryBuilder, $resourceClass);
    }
    
    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void
    {
        if (User::class === $resourceClass &&
            $this->security->isGranted(GenericRoles::ROLE_ADMIN)
        ) {
            $filter = $this->entityManager->getFilters()->enable('softdeleteable');
            $filter->disableForEntity(User::class);
    
            $rootAlias = $queryBuilder->getRootAliases()[0];
            $queryBuilder->andWhere("$rootAlias.deletedAt > '2019-01-01'");
        }
    }
    

    【讨论】:

    • 感谢您的评论!我没有尝试过这个解决方案,但是通过DataProvider我可以disable过滤器,查询我想要查询的实体,然后再次enable过滤器,同时返回感兴趣的对象。
    【解决方案2】:

    这个解决方案对我有用,我希望它适用于遇到这个问题的人:

    通过DataProvider 可以到disable 过滤器,查询您要查询的软删除对象并将其存储在一个变量中,然后再次enable 过滤器并返回您的对象。

    我不知道以这种方式使用DataProvider 是否是一个好习惯,但它并没有对我的应用程序产生副作用。

    这是一个例子:

        public function getItem(string $resourceClass, $id, string $operationName = null, array $context = [])
        {
            if ($this->security->isGranted(GenericRoles::ROLE_ADMIN))
            ) {
                $this->entityManager->getFilters()->disable('softdeleteable');
            }
    
            $softDeletedObject = $this->itemDataProvider->getItem($resourceClass, $id, $operationName, $context);
    
            $this->entityManager->getFilters()->enable('softdeleteable');
    
            return $softDeletedObject;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 2020-10-28
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      相关资源
      最近更新 更多