ApiPaltform - 恢复软删除的元素
ApiPaltform - recover soft deleted element
我正在使用 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
(仍在基地)
在数据库的命令行中输入相同的请求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;
}
我正在使用 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
(仍在基地)
在数据库的命令行中输入相同的请求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;
}