I try to put in place an API Rest with Symfony 3 and FOSRestBundle. My POST/PUT/PATCH action doesn't work.
Here an example with the patch action.
That's my code :
Form :
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class SchoolType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('email')
->add('address')
->add('zip')
->add('city')
->add('url')
->add('siret')
;
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\School',
));
}
}
Controller :
/**
* Update a School entity.
*
* CURL command :
* curl -i -H "Content-Type: application/json" -X PUT -d '{"name" : "TEST", ...}' http://domain_name.com/api/entity/1
*
* @ApiDoc(
* resource=true,
* description="Update a school",
* statusCodes={
* 200="Successful"
* }
* )
*
* @param Request $request
* @param $entity
*
* @return Response
*/
public function putAction(Request $request, School $entity)
{
try {
$request->setMethod('PATCH'); //Treat all PUTs as PATCH
$form = $this->createForm(SchoolType::class, $entity, array("method" => $request->getMethod()));
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->flush();
return $entity;
}
return FOSView::create(array('errors' => $form->getErrors(true, false)), Codes::HTTP_INTERNAL_SERVER_ERROR);
} catch (\Exception $e) {
return FOSView::create($e->getMessage(), Codes::HTTP_INTERNAL_SERVER_ERROR);
}
}
Il always get this in response :
{
"errors": {
"form": {
"children": {
"name": {},
"email": {},
"address": {},
"zip": {},
"city": {},
"url": {},
"siret": {}
}
},
"errors": []
}
}
$form->isValid() return always false.
I begin with Symfony and i don't know what to do.
Thanks
I found a solution. The problem was I didn't submit my form. So instead of using
$form->handleRequest($request);
I use
$form->submit($request->request->all(), false);