Validation Symfony2验证约束表达式实例
我目前正在与ExpressionLanguage验证进行斗争,因为表单验证需要一个约束: 我的表格:Validation Symfony2验证约束表达式实例,validation,symfony,expression,constraints,yaml,Validation,Symfony,Expression,Constraints,Yaml,我目前正在与ExpressionLanguage验证进行斗争,因为表单验证需要一个约束: 我的表格: 文本项 Entity1项目选择器(下拉列表) Entity2项目选择器(下拉列表) 文本区域项 我的愿望: 条件文本项上的一个错误触发器为空,Entity1选择器为空 条件下的另一个错误触发器:Entity1.id==XX和Entity2.id==YY且Textarea为空 到目前为止,我在验证中得到了这个。yml: Experveo\ShopBundle\Entity\Vehicle:
- 文本项
- Entity1项目选择器(下拉列表)
- Entity2项目选择器(下拉列表)
- 文本区域项
- 条件文本项上的一个错误触发器为空,Entity1选择器为空
- 条件下的另一个错误触发器:
和Entity1.id==XX
且Textarea为空Entity2.id==YY
Experveo\ShopBundle\Entity\Vehicle:
constraints:
- Expression:
expression: "this.getTextItem() != '' | this.getEntity1() != ''"
message: error1.
似乎我需要将设置为相反的条件才能使其工作。到目前为止,我还没有找到任何关于这方面的线索
我怎样才能达到这些条件?以下内容根本不起作用
- Expression:
expression: >
this.getTextItem() == ''
&& this.getEntity1() != ''
&& this.getEntity1().getId() === 49
&& this.getEntity2() != ''
&& this.getEntity2() === 914
&& this.getTextAreaItem() == ''"
message: error2.
我终于找到了解决办法。当我在2.4上运行时,根据后面的合并,ExpressionValidator错误地跳过了null或空字符串值的验证 因此,回调选项是一种正确的解决方法,如中所述。就我而言:
/**
* @Assert\Callback
*
* Using a callback is a better solution insted of make an "Assert\Expression" for the class,
* because of a Symfony bug where the ExpressionValidator skip validating if the value if empty or null.
* Exemple for information : https://stackoverflow.com/questions/24649713/assert-expression-validation-not-working-at-attribute-level-in-symfony-2-4
*/
public function validate(ExecutionContextInterface $context)
{
if( '' === $this->getTextItem() && '' === $this->getMark() ){
$context->buildViolation("error 1")
->addViolation();
}
if( '' === $this->getTextItem()
&& '' === $this->getTextAreaItem()
&& (( $this->getEntity1() && $this->getEntity1()->getId() === self::ENTITY1_VALUE)
|| ($this->getEntity2() && $this->getEntity2()->getId() === self::ENTITY2_VALUE))
){
$context->buildViolation("error2")
->addViolation();
}
}
当你得到这个复杂的,我可能会看,特别是看到像这样的硬编码值。您似乎还想检查两个实体的
='
,而不是相反。谢谢您的回复。我想说你的答案是“大”工具,允许更复杂的验证模式和逻辑。下面我建议的回复适合我的需要。但是谢谢你给我指出这条线索。没问题——Symfony的优点是,它可以灵活地执行这两种操作,而不总是需要最复杂的解决方案来解决简单的问题