表单验证忽略空值

Upv*_*ote 10 symfony-forms symfony symfony-2.1

FormType:

class BranchFormType extends AbstractType {

 public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('name');
    }

    public function getName() {
        return 'branch';
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'My\MainBundle\Entity\Branch',
        ));
    }

}
Run Code Online (Sandbox Code Playgroud)

在实体定义中:

<field name="name" column="name" type="string" length="255"/>
Run Code Online (Sandbox Code Playgroud)

没有nullable = true,并且字段在呈现时具有必需属性.

Validation.yml:

My\MainBundle\Entity\Branch:
    properties:
        name:
            - NotBlank: ~
Run Code Online (Sandbox Code Playgroud)

symfony是自动查找此文件还是必须包含在某处?doc只是声明表单自动使用验证服务.

控制器:

    $branch = new Branch();
    $form = $this->createForm(new BranchFormType(), $branch);

    if ($request->isMethod('POST')) {

        $form->bindRequest($request);

        if ($form->isValid()) {
            $em->persist($branch);
            $em->flush();

            return $this->redirect($this->generateUrl('view_branch'));
        }
    }

    return $this->render('MyMainBundle:Branch:create.html.twig', array(
                'form' => $form->createView()
            ));
Run Code Online (Sandbox Code Playgroud)

在提交时我收到以下错误:

SQLSTATE [23000]:完整性约束违规:1048列"名称"不能为空

所以isValid返回true,尽管name是空的并且继续持有具有空值的实体.当名称为空时,isValid如何返回true?ORM定义说nullable = false?`有什么想法吗?我没有定义额外的验证器.我用的是sf2.1

Mic*_*ick 2

验证文件看起来位于正确的文件夹中:

src/My/MainBundle/Resources/config/validation.yml
Run Code Online (Sandbox Code Playgroud)

确保您没有使用验证组?

无论如何,我会用它Assert来看看这个验证文件是否有问题:

启用注释:

# app/config/config.yml
framework:
    validation: { enable_annotations: true }
Run Code Online (Sandbox Code Playgroud)

设置您的实体:

namespace My\MainBundle\Entity\;

use Symfony\Component\Validator\Constraints as Assert;
//...

class Branch{

    /**
     * @Assert\NotBlank
     */
    protected $name;

}
Run Code Online (Sandbox Code Playgroud)

你能试试这个吗?

此外,您可以从控制器中像这样测试验证:

// ...
use My\MainBundle\Entity\Branch;

public function indexAction()
{
    $branch = new Branch();

    $branch->setName('');

    $validator = $this->get('validator');
    $errors = $validator->validate($branch);

    if (count($errors) > 0) {
        return new Response(print_r($errors, true));
    } else {
        return new Response('Entity is valid');
    }
}
Run Code Online (Sandbox Code Playgroud)