symfony 2中的REST表单验证 - 如何测试帖子

时间:2014-03-07 02:20:22

标签: validation rest symfony

表单永远不会有效,但$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);
}

4 个答案:

答案 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,而是使用handleRequestRead this。该表单对handleRequest无效,因为UserType缺少下一个:

  1. 缺少表单字段
  2. 表单字段格式不合适
  3. UserTypegetName函数中应该返回空字符串,并且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);
    
  4. 很难在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;
    }