Хотя в контексте API вы не будете использовать компонент формы для фактического отображения вашей формы в формате HTML ($form->createView()
метод), вы все равно сможете извлечь выгоду из всей магии, которую она предлагает: проверка, события формы и т. Д. API или нет, я лично считаю, что вы всегда должны использовать типы форм в мутациях контроллера.
Например, используя FOSRestBundle, рассмотрим простое действие контроллера, которое выглядит следующим образом:
/**
* @Rest\Put("posts/edit/{id}", name="posts.edit", requirements={"id"="\d+"})
*
* @param Post $post
* @param Request $request
*
* @return Post
*
* @throws BadRequestException
*
*/
public function edit(Post $post, Request $request): Post
{
$form = $this->createForm(PostType::class, $user);
$form->handleRequest($request);
$form->submit($request->request->all());
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($post);
$em->flush();
return $post;
}
// Any error handling of your taste.
// You could consider expliciting form errors.
throw new BadRequestException();
}
Обратите внимание, что Post
сущность и PostType
форма, конечно, должны быть созданы. Я не буду здесь это подробно описывать, поскольку в этом контексте о них особо нечего сказать.
Также обратите внимание, что мы не проверяем, отправлена ли форма. Рендеринг формы как HTML - это работа React в вашем случае, это действие не будет использоваться для получения чего-либо, это исключительно маршрут PUT. Это означает, что любой поступающий туда запрос ДОЛЖЕН быть запросом PUT, содержащим правильные данные, которые должны быть обработаны нашим PostType
, представленным в вашем случае HTML-формой, встроенной вручную в React.
Кроме того, FOSRestBundle, немного выходя за рамки вопроса, подписывается на все, что возвращает ваше действие, и автоматически сериализует его в настроенном формате (я полагаю, в вашем случае, скажем, JSON). Это означает, что наш пример действия может вернуть два возможных ответа:
- Ответ с кодом состояния 200, содержащий нашу сериализованную публикацию. (Вы также можете рассмотреть 204 и ничего не вернуть.)
- Ответ с кодом состояния 400, содержащий все, что мы хотим (скажем, ошибки формы).
Позвольте мне привести вас к документации FOSRestBundle .