【问题标题】:Symfony validator inheritanceSymfony 验证器继承
【发布时间】:2018-07-30 16:04:26
【问题描述】:

我有两个实体类:

class A {

/**
 * @Assert\LessThanOrEqual(3)
 *
 * @var int
 */
protected $attempts;

}

class B extends A {

/**
 * @Assert\LessThanOrEqual(5)
 *
 * @var int
 */
protected $attempts;

}

并进行 1 次测试以检查验证是否正常工作:

public function testSetAttemptsCount()
{
    $block = new B();
    $block->setAttempts(6);

    $errors = $this->getService('validator')->validate($block);
    $this->assertHasViolation($errors, 'attempts', LessThanOrEqual::TOO_HIGH_ERROR);

    $block->setAttempts(4);
    $errors = $this->getService('validator')->validate($block);
    $this->assertNotHasViolation($errors, 'attempts', LessThanOrEqual::TOO_HIGH_ERROR);
}

此测试不会通过,因为它验证了来自 A 类的断言值。 有人知道如何“重写”字段的验证规则吗?

【问题讨论】:

  • 有趣...有人会说它应该像这样工作。会关注这个。
  • 确实很有趣...我可以确认这是v4.1 中的当前行为,并且在挖掘文档以找到一些线索时,我在 GitHub 上发现了一个问题 (@987654321 @) 和 Fabien 的提交 (github.com/symfony/symfony/pull/21053) 指向这个方向。似乎它已在2.7 中修复,但不久后由于 BC 破损而恢复... :(
  • 确实很有趣。一种方法是从 A 类中生成 C 类,并创建一个由 B 和 C 扩展的抽象类 A。但这并不能回答问题。
  • 对不起,错误的问题链接。正确的是:github.com/symfony/symfony/issues/15950

标签: php symfony doctrine


【解决方案1】:

我现在将结束对解决方案的搜索。很明显,有人试图解决这个问题,但它导致了某种 BC 损坏,但是我没有发现任何提及它(所以我们可以更好地理解它)。毕竟,主要版本允许 BC 中断,在我看来,3.04.0 是一个很好的候选者,但不知何故滑倒了想法。

我得到的最好的线索(但不充分也不理想)是来自docs 的引用:

这意味着您可以向属性添加新约束,但不能覆盖它们 ... 要创建您自己的验证,将约束添加到新的验证组

确实,定义自己的验证组可能是解决此问题的一个潜在解决方案,但如果我们无法控制父类(而且我们通常没有),我们就会回到原点。因此,这将涉及在我们的子类中重新定义基类的所有属性。这确实超出了目的。

如果我们将验证规则外部化为YAMLXML,则可以应用在上述基础上的稍微不那么时髦的解决方案。所以,没有注释。在YAML 中,它看起来像这样:

App\Data\Foo:
    properties:
        attempts:
            - LessThanOrEqual: 2
        another:
            - LessThanOrEqual: 5

App\Data\Bar:
    properties:
        attempts:
            - LessThanOrEqual: {value: 5, groups: [Overriden]}
        another:
            - LessThanOrEqual: {value: 5, groups: [Overriden]}

在上面的配置示例中,Bar extends Foo 我们可以复制并粘贴现有的验证规则并粘贴自定义的group(在我的情况下为Overriden)并使用它。这样,我们验证了那些来自父类的约束,这些约束是我们感兴趣的,并且包括我们自己的子类。如果父类使用不同的验证规则格式,则需要稍加努力...

我很想看看是否有人能想出更好的方法,因为我觉得这应该真的适用于我们的盒子......

希望这会有所帮助...

【讨论】:

    猜你喜欢
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    相关资源
    最近更新 更多