ApiPaltform - 恢复软删除的元素

ApiPaltform - recover soft deleted element

我正在使用 ApiPlatformSymfony5

我已经在实体 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(仍在基地)

在数据库的命令行中输入相同的请求return 我是我要恢复的项目。

我也试过禁用 softdelete 如下:

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

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

中重新启用它

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

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

谢谢!

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

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 过滤器和 return你的对象。

我不知道这样使用 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;
    }