Doctrine Symfony2/条令-需要访问数据库的验证约束

Doctrine Symfony2/条令-需要访问数据库的验证约束,doctrine,symfony,doctrine-orm,Doctrine,Symfony,Doctrine Orm,我有一个实体ArticlePattern,它有一个属性pattern(字符串)。我需要访问数据库以检查模式是否正确。因此,我想定义一个方法ArticlePattern::isPatternValid(),并添加一个约束(使用条令的注释),该约束将在Validator对象验证期间检查isPatternValid是否为true 根据我在这里和那里读到的内容,让实体依赖于服务容器不是一个好主意,这意味着我无法从ArticlePattern::isPatternValid()内部访问doctrine服务

我有一个实体
ArticlePattern
,它有一个属性
pattern
(字符串)。我需要访问数据库以检查模式是否正确。因此,我想定义一个方法
ArticlePattern::isPatternValid()
,并添加一个约束(使用条令的注释),该约束将在Validator对象验证期间检查isPatternValid是否为true

根据我在这里和那里读到的内容,让实体依赖于服务容器不是一个好主意,这意味着我无法从ArticlePattern::isPatternValid()内部访问doctrine服务

那么,如何创建需要访问数据库的自定义验证约束呢?我认为从实体类访问服务容器时会遇到很多问题,这是很常见的情况,您如何处理这种情况

编辑:


好的,谢谢大家,所以答案是,您的约束应该覆盖基本的
validatedBy()
方法,并返回容器中约束验证器服务的id

public function validatedBy()
{
    return 'my_pattern_validator';
}

验证器对象可以是:

  • 一个与框架环境完全没有连接的简单对象
  • 一种服务(在的上下文中),只要它执行
    Symfony\Component\Validator\ConstraintValidatorInterface
那你该怎么办

  • 定义一个简单的约束
  • 重写
    validatedBy()
    方法以返回验证器“名称”(
    返回“我的验证器”;
  • 在DIC中定义一个简单的服务:

    <service id="project.validator.my" class="Project\Constraints\MyValidator">
        <!-- service definition here -->
    
        <!-- the service has to be tagged -->
        <tag name="validator.constraint_validator" alias="my_validator" />
    </service>
    
  • 注释已验证的类而不是属性:

    @Assert/MyConstraint(...)
    class MyClass {
        private $firstName;
        private $lastName;
    
        @Assert/Email
        private $email;
    
        ...
    }
    
    class MyValidator extends ConstraintValidator {
        public function isValid($value, Constraint $constraint) {
            // $value is an object rather a property
        }
    }
    
  • 验证器本身看起来与验证属性时非常相似:

    @Assert/MyConstraint(...)
    class MyClass {
        private $firstName;
        private $lastName;
    
        @Assert/Email
        private $email;
    
        ...
    }
    
    class MyValidator extends ConstraintValidator {
        public function isValid($value, Constraint $constraint) {
            // $value is an object rather a property
        }
    }
    

  • 我现在有另一个问题。在我的验证器中,我需要访问条令服务以及被验证对象的其他字段(不仅仅是那个字段)。如何实现这一点?好的,有一个方法ConstraintValidator::$context->getRoot(),它可能保存对验证对象的引用。我会检查的。作为跟进,我发布了另一个问题,也许你也能在那里提供帮助:你能发布验证代码的完整示例吗?