gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:02:59 24 4
gpt4 key购买 nike

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

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

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

编辑:

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

最佳答案

验证器对象可以是:

  • 一个简单的对象,与框架环境完全没有关系。
  • 一个服务(在 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
    }
    }

关于doctrine - Symfony2/Doctrine - 需要访问数据库的验证约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8934607/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com