gpt4 book ai didi

php - Symfony 验证器继承

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:43:19 28 4
gpt4 key购买 nike

我有两个实体类:

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 的断言值。有人知道如何“重写”字段的验证规则吗?

最佳答案

我现在要结束对解决方案的搜索。很明显,有人试图解决这个问题,但它导致了某种 BC 破坏,但我没有找到任何提及它的信息(这样我们可以更好地理解它)。毕竟,主要版本允许 BC 中断,并且在我看来,3.04.0 是一个很好的候选者,但不知何故失误了。

我得到的最好的线索(但无论如何都不充分也不理想)是来自 docs 的引述:

This means you are able to add new constraints to a property, but you cannot override them ... To create your own validation, add the constraints to a new validation group

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

从上面推导出,如果我们将验证规则外部化为 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 粘贴到我的情况)并使用它。这样,我们就可以验证那些来自父类的约束,这些约束是我们感兴趣的,并且包括我们自己的来自子类的约束。如果父类使用不同的验证规则格式,则需要稍微多一些努力...

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

希望这对您有所帮助...

关于php - Symfony 验证器继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51598026/

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