Symfony验证器继承

alv*_*ery 5 php doctrine symfony

我有两个实体类:

class A {

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

}

class B extends A {

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

}
Run Code Online (Sandbox Code Playgroud)

并且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);
}
Run Code Online (Sandbox Code Playgroud)

此测试不会通过,因为它验证来自A类的断言值.是否有人知道如何"重写"字段的验证规则?

Jov*_*vic 5

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

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

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

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

根据上面的推导,如果我们将验证规则外部化为YAML或,则可以应用稍微不那么时髦的解决方案XML。所以,没有注释。在 中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]}
Run Code Online (Sandbox Code Playgroud)

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

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

希望这个对你有帮助...