使用FOSRestBundle中的Symofny Forms处理POST请求

luq*_*o33 5 rest symfony-forms symfony fosrestbundle

我不清楚如何使用带有FOSRestBundle的Symfony表单组件来创建用于创建资源的POST端点.

这是我在POST控制器操作中得到的:

//GuestController.php
public function cpostAction(Request $request)
{
    $data = json_decode($request->getContent(), true);

    $entity = new Guest();
    $form = $this->createForm(GuestType::class, $entity);

    $form->submit($data);

    if ($form->isValid()) {
        $dm = $this->getDoctrine()->getManager();
        $dm->persist($entity);
        $dm->flush();

        return new Response('', Response::HTTP_CREATED);
    }

    return $form;
}
Run Code Online (Sandbox Code Playgroud)

我所做的是:

  1. application/json向端点发送POST请求(/guests);
  2. 创建绑定到实体(Guest)的表单实例;
  3. 由于我正在发送JSON,我需要json_decode将请求提交给表单($form->submit($data)).

我有的问题:

  1. json_decode()Request内容提交到表单之前,我是否真的需要手动处理内容?使用FosRestBundle可以以某种方式自动化此过程吗?
  2. 是否可以将application/x-www-form-urlencoded数据发送到控制器操作并通过以下方式处理:

-

$form->handleRequest($request)
if ($form->isValid()) {
    ...
}
...
Run Code Online (Sandbox Code Playgroud)

我无法完成上述工作,表单实例从未提交过.

  1. 使用表单组件ParamConverter直接与验证器一起使用是否有任何优势- 这是一个想法:

-

/**
 * @ParamConverter("guest", converter="fos_rest.request_body")
*/
public function cpostAction(Guest $guest)
{
    $violations = $this->getValidator()->validate($guest);

    if ($violations->count()) {
        return $this->view($violations, Codes::HTTP_BAD_REQUEST);
    }

    $this->persistAndFlush($guest);

    return ....;
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 0

我正在尝试对你做同样的事情,但很难找到这个主题的答案。我认为今天为移动应用程序开发带有 API Rest 的网站是一个重要的主题。反正!

请在下面找到我的答案:

在将请求内容提交到表单之前,我真的总是必须手动对其进行 json_decode() 吗?

不,我得到这样的数据 $params = $request->query->all(); $user->setUsername($params['fos_user_registration_form']['用户名']);

这个过程可以通过 FosRestBundle 以某种方式自动化吗?

我不这么认为。

是否可以将 application/x-www-form-urlencoded 数据发送到控制器操作并使用

是的,但我目前正在尝试这样处理我的表格,但我做不到。

与直接使用 ParamConverter 和验证器一起使用表单组件是否有任何优势 - 这是想法:

我猜我是否只会使用以下命令注册用户:
$userManager = $this->get('fos_user.user_manager');

并手动进行控制。

我在这里发布了一个问题,我正在等待: https://github.com/FriendsOfSymfony/FOSUserBundle/issues/2405

您是否设法获得更多信息?