我正在研究用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");
}
}
答案 0 :(得分:1)
像往常一样,你必须在这里做出选择:
快速,简单,肮脏的:
使用查询参数可以向控制器添加单个参数:
示例:
/**
* @Rest\Get("/users/{userId}")
* @QueryParam(name="foo")
*/
public function getUsersByIdAction($userId, Request $request, $foo)
{
更慢,更安全,更清洁的一个:
构建自定义表单类型以处理您的请求/查询中可能包含的任何参数,并将它们映射到适当的对象,然后您可以使用该对象从中提取解析的值并传递给查询构建器/存储库/管理器