我正在使用
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
中重新启用它
有人知道我做错了什么吗?或者是否有其他方法来恢复软删除的项目
或者如果您有更多关于该主题的文档,我将不胜感激,因为我已经没有选择了
谢谢!
是的,这并不简单,因为您的查询在扩展之外执行。仅当经过身份验证的用户具有管理员角色时,我可能会尝试禁用用户实体的软可删除过滤器。执行查询后它仍然会被禁用,但它不会造成太多副作用,因为管理员用户应该能够看到已删除的用户实体。像这样的东西。
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
过滤器并返回您的对象。
我不知道以这种方式使用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;
}