2016-12-29 85 views
5

我不清楚如何使用Symfony表单组件和FOSRestBundle作为我用来创建资源的POST端点。使用FOSRestBundle中的Symofny表单处理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; 
} 

我要做的就是:

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

我有以下问题:

  1. 我真的总是要json_decode()Request内容之前手动将其提交表单?这个过程可以用FosRestBundle自动完成吗?
  2. 是否有可能application/x-www-form-urlencoded数据发送到控制器动作,并用它来处理:

-

$form->handleRequest($request) 
if ($form->isValid()) { 
    ... 
} 
... 

我不能得到上述工作,表单实例从未提交。

  • 是否有使用窗体组件并且使用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 ....; 
    } 
    

    谢谢!

    +0

    也许[this](https://www.cloudways.com/blog/rest-api-in-symfony-3-1/)文章可以帮助你。 –

    +0

    在我看来它与你的fos_rest配置有关。你能在这里分享吗? –

    回答

    0

    我试图对你做同样的事情,很难找到这个问题的一些答案。我认为今天这是一个重要的主题,开发移动应用程序api休息的网站。无论如何!

    请找我的回答如下:

    我真的总是要提交给表单之前手动json_decode()请求的内容吗?

    不,我得到这样的数据该 $ PARAMS = $请求 - >查询 - >所有(); $ user-> setUsername($ params ['fos_user_registration_form'] ['username']);

    这一进程能以某种方式与FosRestBundle自动化?

    我不这么认为。

    是否可以应用/的X WWW的形式,进行了urlencoded的数据发送到控制器动作,并将它与

    是处理,但我目前正试图处理我的形式就是这样,我做不到。

    是否有使用窗体组件在使用ParamConverter连同直接验证的任何优势 - 这里的理念是:

    没有

    我猜如果我不是去注册用户:
    $ userManager = $ this-> get('fos_user.user_manager');

    并手动进行我的控制。

    我贴在这里的一个问题,我在等待: https://github.com/FriendsOfSymfony/FOSUserBundle/issues/2405

    你设法得到进一步的信息?