【问题标题】:Symfony2/Doctrine - validation constraint which requires access to a databaseSymfony2/Doctrine - 需要访问数据库的验证约束
【发布时间】:2012-01-19 22:57:25
【问题描述】:

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

从我在这里和那里阅读的内容来看,使实体依赖于服务容器并不是一个好主意,这意味着我无法从 ArticlePattern::isPatternValid() 内部访问学说服务。

那么我怎样才能创建一个需要访问数据库的自定义验证约束呢?看到这么多关于从实体类访问服务容器的问题,您如何处理我认为很常见的这种情况。

编辑:

好的,谢谢大家,所以答案是Custom Validation Constraint

【问题讨论】:

  • 能否请您发布您的验证码的完整示例?

标签: doctrine symfony doctrine-orm


【解决方案1】:

验证器对象可以是:

  • 一个简单的对象,与框架环境完全没有联系。
  • 一项服务(在dependency injection container 的上下文中)可以做任何事情,只要它阻碍Symfony\Component\Validator\ConstraintValidatorInterface

那你要做什么?

  1. 定义一个简单的约束
  2. 重写 validatedBy() 方法以返回验证器“名称”(return 'my_validator';)
  3. 在 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>
    

编辑

您已经询问了多个属性验证。在这种情况下,您可以创建一个与对象相关而不是与对象属性相关的验证器。

  1. 在您的约束类中定义该约束的目标(属性/类):

    class MyConstraint ... {
        ...
    
        public function targets() {
            return self::CLASS_CONSTRAINT;
        }
    }
    
  2. 注释已验证的类而不是属性:

    @Assert/MyConstraint(...)
    class MyClass {
        private $firstName;
        private $lastName;
    
        @Assert/Email
        private $email;
    
        ...
    }
    
  3. 验证器本身看起来与验证属性的情况几乎相同:

    class MyValidator extends ConstraintValidator {
        public function isValid($value, Constraint $constraint) {
            // $value is an object rather a property
        }
    }
    

【讨论】:

  • 我现在有另一个问题。在我的验证器中,我需要访问教义服务以及验证对象的其他字段(不仅是那个字段)。我怎样才能做到这一点?
  • 好的,有一个方法 ConstraintValidator::$context->getRoot() 可以保存对正在验证的对象的引用。我会检查的。
  • 作为后续,我发布了另一个问题,也许您也可以在那里提供帮助:stackoverflow.com/questions/8961083/…
【解决方案2】:

您的约束应覆盖基本 validatedBy() 方法并返回容器中约束验证器服务的 ID。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2015-09-30
    • 2013-05-21
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多