Symfony 3 rest API查询字符串

时间:2017-02-04 17:10:43

标签: rest api symfony

我正在研究用Symfony 3编写的项目,我必须创建一个REST API控制器。

我有经典的溃败,例如:

/ users :( GET)获取所有用户

/ users / {id} :( GET)获得单个用户

/ users:(POST)创建用户

依旧......

但我想知道如何使用多个参数来实现搜索路由,例如此URL的用户:

/users?name=John&surname=Doe&age=20&city=London

如果没有设置值,如何使用查询字符串创建此路由并在其中搜索?

这是我的控制器

namespace AppBundle\Controller;

use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\FOSRestController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Exception\HttpException;
use AppBundle\Entity\User;
use AppBundle\Form\UserType;

class UserController extends FOSRestController
{
    /**
     * @Rest\Get("/users")
     */
    public function getUsersAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();
        $users = $em->getRepository(User::class)->findAll();
        if (!$users) {
            throw new HttpException(400, "Invalid data");
        }
        return $users;

    }

    /**
     * @Rest\Get("/users/{userId}")
     */
    public function getUsersByIdAction($userId, Request $request)
    {
        $em = $this->getDoctrine()->getManager();
        $user = $em->getRepository(User::class)->find($userId);

        if (!$userId) {
            throw new HttpException(400, "Invalid id");
        }

        return $user;
    }

    /**
     * @Rest\Post("/users")
     */
    public function postUsersAction(Request $request)
    {
        $user = new User();
        $form = $this->createForm(UserType::class, $user);
        $form->handleRequest($request);
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($user);
            $em->flush();
            return $user;
            //return new JsonResponse( [$data, $status, $headers, $json])
        }

        throw new HttpException(400, "Invalid data");
    }
}

1 个答案:

答案 0 :(得分:1)

像往常一样,你必须在这里做出选择:

快速,简单,肮脏的:

使用查询参数可以向控制器添加单个参数:

示例:

/**
 * @Rest\Get("/users/{userId}")
 * @QueryParam(name="foo")
 */
 public function getUsersByIdAction($userId, Request $request, $foo)
 {

Documentation

更慢,更安全,更清洁的一个:

构建自定义表单类型以处理您的请求/查询中可能包含的任何参数,并将它们映射到适当的对象,然后您可以使用该对象从中提取解析的值并传递给查询构建器/存储库/管理器

Documentation