【问题标题】:Practical case on Symfony2 validation constraint expressionSymfony2验证约束表达式的实际案例
【发布时间】:2016-01-04 13:59:06
【问题描述】:

我目前正在与 ExpressionLanguage 验证就表单验证所需的约束进行斗争:

我的表格:

  • 文本项
  • Entity1 项目选择器(下拉)
  • Entity2 项目选择器(下拉)
  • 文本区域项

我的愿望:

  • 条件 Text Item 为空且 Entity1 选择器为空时的一个错误触发器
  • 另一个错误触发条件:Entity1.id == XXEntity2.id == YY 并且 Textarea 为空

到目前为止,我在 validation.yml 中得到了这个:

Experveo\ShopBundle\Entity\Vehicle:
    constraints:
        - Expression:
            expression: "this.getTextItem() != '' |  this.getEntity1() != ''"
            message: error1.

看来我需要设置相反的条件才能使其发挥作用。到目前为止,我在documentationin expression language syntax help 上都没有找到任何高级线索。

我怎样才能达到这些条件?以下根本不起作用...

- Expression:    
    expression: >
        this.getTextItem() == ''
        && this.getEntity1() != ''
        && this.getEntity1().getId() === 49
        && this.getEntity2() != ''
        && this.getEntity2() === 914
        && this.getTextAreaItem() == ''"
    message: error2.

【问题讨论】:

  • 当您遇到这种复杂情况时,我可能会查看creating a custom validation constraint,尤其是看到这样的硬编码值。您似乎还想为您的两个实体检查== '',而不是相反。
  • 感谢您的回复。我会说你的答案是“大”工具,允许更复杂的验证模式和逻辑。我在下面建议的回调适合我的需要。但是谢谢你给我指出这条线索。
  • 没问题 - Symfony 的优点是可以灵活地做任何一个,而不总是需要最复杂的解决方案来解决一个简单的问题

标签: validation symfony expression constraints yaml


【解决方案1】:

我终于找到了解决办法。当我在 2.4 上运行并根据 this fix 稍后合并时,ExpressionValidator 错误地跳过了对 null 或空字符串值的验证。

因此,回调选项是一种正确的解决方法,正如this other SO post 中提到的那样。就我而言:

 /**
 * @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();
    }
}

【讨论】:

    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多