ApiPaltform - 恢复软删除的元素

问题描述 投票:0回答:2

我正在使用

ApiPlatform
Symfony5

我已经在实体上实现了

softdelete
User

此实体已正确软删除,我仍然想显示某些角色的已删除用户,因此我正在尝试

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
(仍在基地中)

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

我还尝试禁用

softdelete
,如下所示:

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

但是这样做会禁用整个应用程序,并且我无法在

UserExtension

中重新启用它

有人知道我做错了什么吗?或者是否有其他方法来恢复软删除的项目

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

谢谢!

symfony doctrine api-platform.com soft-delete doctrine-extensions
2个回答
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'");
    }
}

0
投票

这个解决方案对我有用,我希望它对任何遇到这个问题的人都有效:

通过

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

我不知道以这种方式使用a

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.