繁体   English   中英

Symfony REST API:具有多个参数的查询

[英]Symfony REST API: query with multiple parameters

如何实现根据URL中提供的参数返回服务列表的方法?

因此,如果没有参数,则返回所有服务。 如果提供了用户和类别,则按两个参数进行过滤。 如果仅提供用户或仅提供类别,则按参数之一进行过滤。

/**
 * @Route("/", name="api_services_search")
 * @Method("GET")
 * @ApiDoc(
 *  section = "Service",
 *  description="Search services",
 *  parameters={
 *     {"name"="category", "dataType"="int", "required"=true, "description"="Category ID"}
 *     {"name"="user", "dataType"="int", "required"=true, "description"="User ID"}
 *   },
 *  output="CoreBundle\Entity\Service"
 * )
 */
public function searchAction(Request $request){

    $categoryId = $request->query->get('category');
    $userId = $request->query->get('user');

    $result = new JsonResponse();

    if($categoryId){
        $category = $this->getDoctrine()->getRepository('CoreBundle:ServiceCategory')->find($categoryId);
        if($category == null){
            throw new ApiException('category not found');
        }
        $serviceList = $this->getDoctrine()
            ->getRepository('CoreBundle:Service')->findBy(array('serviceCategory' => $category));
    }
    else if($userId){
        $user = $this->getDoctrine()->getRepository('CoreBundle:BasicUser')->find($userId);
        if($user == null){
            throw new ApiException('user not found');
        }

        $serviceList = $this->getDoctrine()
            ->getRepository('CoreBundle:Service')->findBy(array('basicUser' => $user));
    } else{
        $serviceList = $this->getDoctrine()
            ->getRepository('CoreBundle:Service')->findAll();
    }

    $serviceListJson = $this->serializeDataObjectToJson($serviceList);

    $result->setContent($serviceListJson);
    return $result;
}

范例网址:

  http://127.0.0.1:8000/api/v1/services/?category=3&user=4

我有错误:

 Too many parameters: the query defines 1 parameters and you bound 2 (500 Internal Server Error)

我也在寻找可维护的解决方案,将来可以在其中轻松地向URL添加更多参数

我会选择这样的东西。 恐怕您无法通过查询参数添加/编辑使它更通用且不可知。

/**
 * Controller action
 */
public function searchAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();


    $serviceList = $em->getRepository('CoreBundle:Service')->fetchFromFilters([
        'serviceCategory' => $request->query->get('category'),
        'basicUser' => $request->query->get('user'),
    ]);

    $serviceListJson = $this->serializeDataObjectToJson($serviceList);

    $result = new JsonResponse();
    $result->setContent($serviceListJson);
    return $result;
}

/**
 * Repository fetching method
 */
public function fetchFromFilter(array $filters)
{
    $qb = $this->createQueryBuilder('s');

    if (null !== $filters['serviceCategory']) {
        $qb
            ->andWhere('s.serciceCategory = :serviceCategory')
            ->setParameter('serviceCategory', $filters['serviceCategory'])
        ;
    }
    if (null !== $filters['basicUser']) {
        $qb
            ->andWhere('s.basicUser = :basicUser')
            ->setParameter('basicUser', $filters['basicUser'])
        ;
    }

    return $qb->getQuery()->getResult();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM