Published on

Posting data to Symfony2

Authors

After struggling for a couple of hours I found out why my POST call to our Symphony2 backend was seemingly not working.

    /**
     * @var Request $request
     * @Rest\View()
     */
    public function postCustomersAction(Request $request) {
        $customer = new Customer();
        $form = $this->createForm('customer', $customer);
        $form->handleRequest($request);
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($customer);
            $em->flush();

            $data = array("id" => $customer->getId());

            $view = $this->view($data, Codes::HTTP_CREATED)
                ->setFormat('json');
        } else {
            $data = array("errors" => $form->getErrorsAsString());
            $view = $this->view($data, Codes::HTTP_BAD_REQUEST)
                ->setFormat('json');
        }
        return $this->handleView($view);
    }

all was nice and good, but when posting from both phpunit and rest client I had no luck getting any data into the form.

I was sure all data was correct, inspected the http request headers and found that the body was post in the following fashion: {"name":"test", "number":"4343"}. Then I came to the idea that the data might have to be wrapped to identify the type of the object. This resulted in instant success. I wrote the following unit test.

   public function testPostCustomer()
    {
        $client = static::createClient();
        $client->request(
            'POST',
            '/customers',
            array("customer" =>
                array(
                    "name" => "lifely",
                    "number" => "1010"
                )
            )
        );

        $response = $client->getResponse();
        $data = json_decode($response->getContent(), true);

        $this->assertEquals(Codes::HTTP_CREATED, $response->getStatusCode());
        $this->assertArrayHasKey("id", $data);
    }