在 Symfony 6 中向 api 请求添加过滤器

问题描述 投票:0回答:1

前一段时间,我看到一个 symfony 项目,它允许前端使用我喜欢的语法发出过滤的 api 请求:

property[operator]=value
,例如
date[gte]=value
等..
我确信他们在项目中没有使用 api 平台,但我不明白我该怎么做。

有图书馆可以做这些工作吗?
谢谢

php symfony doctrine-orm doctrine symfony6
1个回答
0
投票

我不确定您在哪一部分遇到任何问题或您如何尝试解决问题,但您可以轻松构建它。我制作了一些伪控制器代码,展示了如何做到这一点的一种方法。

public function api(Request $request, EntityManagerInterface $em): Response
{

    // Restrict fields and operators
    $allowed_fields = ['field_1', 'field_2'];
    $allowed_operators = ['gt', 'lt'];
    $found_filters = [];

    // Go through the query and look for valid filters
    foreach ($request->query->all() as $fieldname => $filters) {
        if (in_array($fieldname, $allowed_fields) && is_array($filters)) {
            foreach ($filters as $operator => $value) {
                $found_filters[$fieldname] = [$operator => $value];
            }
        }
    }

    // Example filtering using doctrine queryBuilder
    $qb = $em->createQueryBuilder();
    $qb->select('u')->from('User', 'u')->where('u.status = active');

    foreach ($found_filters as $fieldname => $filter) {
        foreach ($filter as $operator => $value) {
            switch ($operator) {
                case 'gt':
                    $qb->andWhere($qb->expr()->gt('u.' . $fieldname, ':' . $fieldname . "-" . $operator));
                    break;

                case 'lt':
                    $qb->andWhere($qb->expr()->lt('u.' . $fieldname, ':' . $fieldname . "-" . $operator));
                    break;

            }
            $qb->setParameter($fieldname . "-" . $operator, $value);
        }
    }

    $query = $qb->getQuery();
    $result = $query->getResult();
}

我想您可以轻松地将其扩展以满足您的需求。恕我直言,最重要的是确保您不能在这里进行恶意或错误查询,这就是为什么我使用准备好的语句以及运算符和过滤器的白名单,确保您想在上面添加一些验证,希望它有帮助

© www.soinside.com 2019 - 2024. All rights reserved.