我正在使用 Symfony 的验证器 Getter 组件 与 symfony 表单结合使用。
在我的一个实体文件中,我有:
use Symfony\Component\Validator\Constraints as Assert;
class StudentPaper
{
.....
/**
* @Assert\IsTrue(message = "You must include a paper with your submission")
*/
public function hasPaper()
{
// I originally had logic that checked the validity, but just
// changed the return value to 'true' to prove that it's not working.
return true;
}
}
不幸的是,验证总是失败(即使我将返回值硬核为
true
)。 验证代码似乎没有执行,表单触发了错误。 我什至尝试用 IsFalse
和硬编码 false
替换它。 结果相同。
有人遇到过这个吗?
Symfony 2.8。 PHP 5.6.15
嗯,我无法完全解释实际问题是什么(因为我不知道),但我确实找到了解决方案。
在我的 StudentPaper 实体中
/**
* Bidirectional - Student Papers have one file.
*
* @ORM\OneToOne(targetEntity="StudentPaperFile", inversedBy="student_paper", cascade={"persist", "remove"}, orphanRemoval=true)
* @ORM\JoinColumn()
* @Assert\Valid()
*/
protected $paper;
作为财产。 事实证明,具有名为
paper
的属性和名为 hasPaper()
的验证 getter 会导致意外行为。 一旦我将函数名称从 hasPaper()
更改为 hasTesting()
或 hasSubmittedPaper
,吸气剂就会按预期工作。
所以解决方案是 getter 函数不能是 get/is/has + 映射的属性名称。
我遇到了同样的问题(未设置对象值),将 getter 名称从
(is|has|get)Property
更改为不同的名称 (is|has|get)Something
并没有解决问题。但是,指定验证组确实:
这有效:
System\Bus\DTO\Filter:
getters:
inRange:
- Range:
min: 0
max: 86400
groups: [Profiles]
但这不是:
System\Bus\DTO\Filter:
getters:
inRange:
- Range:
min: 0
max: 86400