gpt4 book ai didi

php - 如何在 Api-Platform 中为虚拟属性(property)引入过滤功能?

转载 作者:行者123 更新时间:2023-12-04 13:25:56 25 4
gpt4 key购买 nike

我正在使用 Symfony 5 和 API 平台。
一类我的属性之一是通过 postLoad 设置的。听众。该属性仅在某些条件下设置(否则为 NULL ),我希望允许 REST API 用户根据此属性是否为空或有值来过滤资源。
因为虚拟属性没有持久化到数据库中,所以我假设没有 Doctrine 过滤器,例如ExistsFilter , 将在此属性上工作。
如何使用 Symfony 5 和 API 平台为虚拟 Assets 创建过滤功能?

最佳答案

您可以创建自己的 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 文档中使用自定义过滤器。

关于php - 如何在 Api-Platform 中为虚拟属性(property)引入过滤功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68497754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com