我正在使用Symfony 5和API平台。
我的一个类通过postLoad侦听器设置了它的一个属性。该属性仅在特定条件下设置(否则为NULL),我希望允许REST API用户根据该属性是null还是有值来过滤资源。
因为虚拟属性不会持久化到数据库中,所以我假设没有规则过滤器,例如ExistsFilter,将对此属性起作用。
如何使用Symfony 5和API-platform为虚拟资产创建过滤功能?
发布于 2021-07-26 11:29:32
您可以创建自己的custom ORM filters。
一个非常简单的例子来说明如何做到这一点:
假设有一个类:
Foo {
public int $weight;
public function isHeavy(): bool {
return $this->weight > 40;
}
}因为heavy是一个“虚拟”属性,所以你不能直接用它来过滤。
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\AbstractContextAwareFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use Doctrine\ORM\QueryBuilder;
class HeavyFilter extends AbstractContextAwareFilter
{
public function getDescription(string $resourceClass): array
{
// I'm making the filter available only
if (Foo::class !== $resourceClass) {
return [];
}
if (!$this->properties) {
return [];
}
$description = [];
$description['heavySearch'] =
[
'property' => 'heavy',
'type' => 'bool',
'required' => false,
'swagger' => [
'description' => 'Search for heavy foos',
'name' => 'Heavey Search',
'type' => 'bool',
],
];
return $description;
}
protected function filterProperty(
string $property,
$value,
QueryBuilder $queryBuilder,
QueryNameGeneratorInterface $queryNameGenerator,
string $resourceClass,
string $operationName = null
): void {
if ('heavySearch' !== $property) {
return;
}
if ($value === true) {
$queryBuilder
->andWhere('o.weigth > 40');
}
else {
$queryBuilder
->andWhere('o.weight <= 40');
}
}
}我还没有真正测试过这一点,只是在这里快速编写了一下,但基本的想法是正确的。你需要对你自己的情况进行调整,而且你会有一个自定义的过滤器,甚至可以在Open Api文档中使用。
https://stackoverflow.com/questions/68497754
复制相似问题