YML验证文件被忽略。

16
我刚开始学习Symfony 2框架,并且在一个非常基本的验证任务中遇到了困难。我有一个实体模型Post,其中有一个成员slug,我使用它来构建链接到帖子。在Post.orm.yml中,我定义了unique: true,也希望将此约束条件作为验证器包含在内。
我创建了一个名为validation.yml的文件:
# src/OwnBundles/BlogpostBundle/Resources/config/validation.yml

OwnBundles\BlogpostBundle\Entity\Post:
    properties:
        slug:
            - NotBlank: ~
    constraints:
        - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: slug

我的控制器中的创建函数非常简单:

public function addAction(Request $request)
{
    $post = new Post();
    $form = $this->createForm(new PostType(), $post);

    if($request->getMethod() == 'POST')
    {
        $form->bind($request);
        if($form->isValid())
        {
            $em = $this->getDoctrine()->getManager();
            $em->persist($post);
            $em->flush();
            return $this->redirect(
                $this->generateUrl('own_bundles_blogpost_homepage')
            );
        }
    }
    return $this->render(
        'OwnBundlesBlogpostBundle:Default:add.html.twig',
        array(
            'title' => 'Add new blogpost',
            'form' => $form->createView(),
        )
    );
}

基础页面流程正常运行,我可以添加帖子并查看它们,但如果我复制一篇文章的标题以测试我的验证,它会抛出一个异常:SQLSTATE[23000]:完整性约束违例:1062重复条目“duplicate-slug”对于关键字“UNIQ_FAB8C3B3989D9B62”。我已经浏览了相当长时间的文档,但我无法找出为什么我的$form->isValid()返回true

1个回答

35

您在app/config/config.yml中启用了验证吗?

...

framework:
    ...
    validation:    { enabled: true }
    ...

...

如果您还想使用注解定义验证,那么您需要同时启用验证和注解验证:

...

framework:
    ...
    validation:    { enabled: true, enable_annotations: true }
    ...

...

然后不要忘记清除app/cache目录。


1
我的config.yml文件中写着:framework: validation: { enable_annotations: true };我以为这样就可以启用验证了,但是我错了...感谢您的快速帮助,我不知道为什么找不到这个。 - nikolas
如果您想要使用注释,必须同时使用两个参数。我已经编辑了我的答案。 - AlterPHP
3
Symfony文档只是说“Symfony验证器默认启用”,但这是错误的!Symfony做得不好,不好!:D - E Ciotti
“配置参考”(http://symfony.com/doc/current/reference/configuration/framework.html#validation)中提到:“类型:布尔型,默认值为true,如果启用表单支持则为true,否则为false。” - martin
你使用Idea/PHPStorm吗?如果是的话,你是否在实体验证注释上得到了自动完成? - RichieHH
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接