首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Api-Platform中为虚拟财产引入过滤功能?

如何在Api-Platform中为虚拟财产引入过滤功能?
EN

Stack Overflow用户
提问于 2021-07-23 18:28:22
回答 1查看 97关注 0票数 4

我正在使用Symfony 5和API平台。

我的一个类通过postLoad侦听器设置了它的一个属性。该属性仅在特定条件下设置(否则为NULL),我希望允许REST API用户根据该属性是null还是有值来过滤资源。

因为虚拟属性不会持久化到数据库中,所以我假设没有规则过滤器,例如ExistsFilter,将对此属性起作用。

如何使用Symfony 5和API-platform为虚拟资产创建过滤功能?

EN

回答 1

Stack Overflow用户

发布于 2021-07-26 11:29:32

您可以创建自己的custom ORM filters

一个非常简单的例子来说明如何做到这一点:

假设有一个类:

代码语言:javascript
复制
Foo {

    public int $weight;

    public function isHeavy(): bool {
        return $this->weight > 40;
    }
}

因为heavy是一个“虚拟”属性,所以你不能直接用它来过滤。

代码语言:javascript
复制
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文档中使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68497754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档