表单永远不会有效,但$form->getErrors()
不会出错。
由于它将使用DEV HTTP客户端进行REST API测试
测试数据
标题
Content-Type:application/json
体:
{"username":"sad","password":"123","email":"asdsads@fgfdg.com"}
我没有任何validation.yml文件
有没有任何方法可以找出问题是什么(错误信息)?
public function postUserAction(Request $request)
{
return $this->processForm(new User(),$request);
}
private function processForm(User $user, Request $request )
{
$form = $this->createForm(new UserType(), $user);
$form->handleRequest($request);
if ($form->isValid()) {
return array('form' => 'valid');
}
return \FOS\RestBundle\View\View::create($form->getErrors(),400);
}
答案 0 :(得分:3)
经过一点调试后: isValid()检查表单,例如表单是否已提交。它不是,所以我改为
...
$form = $this->createForm(new UserType(), $user);
//$form->handleRequest($request);
$form->submit($request);
if ($form->isValid()) {
...
现在它有效。
答案 1 :(得分:1)
调试表单验证时,
使用$form->getErrorsAsString()
代替$form->getErrors()
。
(将运行到深层,包括表单子项。)
答案 2 :(得分:1)
这对我有用:
$form = $this->createForm(new UserType(), $user);
$jsonData = json_decode($request->getContent(), true); // "true" to get an associative array
if ('POST' === $request->getMethod()) {
$form->bind($jsonData);
...
}
答案 3 :(得分:0)
我迟到回复这个,但是,所有答案都是错误的。应该避免使用submit
,而是使用handleRequest
。 Read this。该表单对handleRequest
无效,因为UserType
缺少下一个:
在UserType
类getName
函数中应该返回空字符串,并且csrf_protection
应该被禁用(如果您使用的是API
方法form
来自Symfony2项目的not generated
:
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'UserApiBundle\Entity\User',
'csrf_protection' => false,
));
}
public function getName()
{
return '';
}
submit
不会检查这一点,对POST
来说这是一个糟糕的方法。您可以将PUT
请求用于更新User
,因为xyz原因不会提交password
字段(例如:权限)。
$form->submit($request, false);
很难在Symfony2中挖掘form
错误。您可以使用此函数来获取错误:
public function getErrors($form)
{
$errors = array();
foreach ($form as $fieldName => $formField) {
$currentError = $formField->getErrors();
if ($currentError->current()) {
$current = $currentError->current();
$errors[$fieldName] = $current->getMessage();
}
}
return $errors;
}