Symfony2获取实体上的验证约束

13

我正在研究一种获取实体的所有验证约束条件的方法(我的目标是将这些数据以JSON格式返回,并使用JQuery验证插件在客户端应用相同的约束条件),但是我在获取约束条件方面遇到了一些困难,以下是我的当前代码:

    $metadata = new \Symfony\Component\Validator\Mapping\ClassMetadata("Namespace\JobBundle\Entity\Job");
    $annotationloader = new AnnotationLoader(new AnnotationReader());
    $annotationloader->loadClassMetadata($metadata);

我在$metadata中得到的约束条件属性是一个空数组,而其他属性($properties和$members)只有错误信息⋯⋯但没有实际的约束条件(例如: required, integer⋯⋯)。

我做错了什么?


你尝试过 $metadata = $this->container->get('validator')->getMetadataFactory()->getClassMetadata("Namespace\JobBundle\Entity\Job"); 吗? - Thomas Potaire
刚刚注意到$properties属性实际上包含一个约束数组,您的建议也给出了相同的结果,所以如果您提供答案,我将非常乐意接受它。 - Youssef
2个回答

18

我可能会使用验证器服务而不是实例化一个新的类元数据。你永远不知道是否通过服务初始化了某些类。

$metadata = $this->container
                 ->get('validator')
                 ->getMetadataFactory()
                 ->getClassMetadata("Name‌​space\JobBundle\Entity\Job");

同时$metadata应该包含您正在寻找的数据

Symfony 2.3及以上版本

$metadata = $this->container
                 ->get('validator')
                 ->getMetadataFor("Name‌​space\JobBundle\Entity\Job");

1
顺便提一下,Symfony 2.3中的getClassMetadata已经弃用,建议使用getMetadataFor。+1 - Michał Powaga
1
适用于Symfony 4.0 - user2182349

7
private function getValidations()
    {
        $validator=$this->get("validator");
        $metadata=$validator->getMetadataFor(new yourentity());
        $constrainedProperties=$metadata->getConstrainedProperties();
        foreach($constrainedProperties as $constrainedProperty)
        {
            $propertyMetadata=$metadata->getPropertyMetadata($constrainedProperty);
            $constraints=$propertyMetadata[0]->constraints;
            foreach($constraints as $constraint)
            {
                //here you can use $constraint to get the constraint, messages etc that apply to a particular property of your entity
            }
        }
    }

$validator=$this->get("validator");
$metadata=$validator->getMetadataFor(new yourentity());

现在,$metadata对象包含有关与您特定实体相关的验证的所有元数据。


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