我试图弄清楚为什么在我使用预先填充的实体创建一个来自json请求的值时表单没有验证。
这是Symfony中已配置FosRestBundle的控制器:
public function createAction(Request $request)
{
$house = new House();
$house->setTitle($request->get('title'));
$house->setDescription($request->get('description'));
$house->setPostcode($request->get('postCode'));
$house->setPhoneNumber((int) $request->get('phoneNumber'));
$availability = $request->get('available') ? true : false;
$house->setAvailability($availability);
$form = $this->createCreateForm($house);
$form->handleRequest($request);
$response = new JsonResponse();
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($house);
$em->flush();
return $response->setData(array(
'success' => true
));
}
return $response->setData(array(
'success' => false,
'errors' => $this->getFormErrors($form)
));
}
private function createCreateForm(House $entity)
{
$form = $this->createForm(new HouseType(), $entity, array(
'action' => $this->generateUrl('houses_create'),
'method' => 'POST',
'csrf_protection' => false
));
return $form;
}
yaml配置文件:
# app/config/config.yml
fos_rest:
param_fetcher_listener: true
body_listener: true
routing_loader:
default_format: json
exception:
enabled: true
# configure the view handler
view:
force_redirects:
html: true
formats:
json: true
xml: true
templating_formats:
html: true
# add a content negotiation rule, enabling support for json/xml for the entire website
format_listener:
enabled: true
rules:
- { path: ^/, priorities: [ json, xml, html ], fallback_format: html, prefer_extension: false }
例如,如果我执行$form->get('title')->getData()
,我可以看到表单已正确填充,但仍然没有通过验证,当我执行$this->getFormErrors($form)
时,我只得到一个空数组。
关于如何调试此问题的任何想法?
答案 0 :(得分:1)
为了接收json,您需要启用正文监听器功能。
在config.yml
:
fos_rest:
body_listener: true
答案 1 :(得分:0)
当你发起$ form时我注意到了一个拼写错误:" createCreateForm" - >它应该只是" createForm"。
如果这不起作用,请在" if($ form-> isValid()){"之后检查来自$ form-> getData()的值。部分。我怀疑框架不知道如何处理请求(不是来自标准表格)。在那种情况下,您可以手动设置实体上的值并保存它。
$house->setStuff($request->request->get('stuff');
...
$em->persist($house);`$em->flush();`