【问题标题】:Symfony validate a property if another property is not not blank如果另一个属性不为空,Symfony 验证一个属性
【发布时间】:2015-04-01 02:56:28
【问题描述】:

我有一堂课

Class SubjectSegment{ 
 /**
 *@CustomAssert\MyCitizenshipNumber()
 */ 
 private $citizenshipNumber; 
 /**
 *@CustomAssert\MyDate()
 */ 
 private $citizenshipNumberIssuedDate;
}

我真正想要做的是有效的CitizenshipNumberIssuedDate 如果citizenNumber 存在...

实现这一目标的最佳方法是什么

【问题讨论】:

    标签: php validation symfony


    【解决方案1】:

    您好,请关注http://symfony.com/doc/current/reference/constraints/Callback.html

    use Symfony\Component\Validator\Constraints as Assert;
    use Symfony\Component\Validator\ExecutionContext;
    
    /**
     * @Assert\Callback(methods={"isCitizenDateValid"})
     */
    
    Class SubjectSegment{ 
        /**
        *@CustomAssert\MyCitizenshipNumber()
        */ 
        private $citizenshipNumber; 
        /**
        *@CustomAssert\MyDate()
        */ 
        private $citizenshipNumberIssuedDate;
    
        public function isCitizenDateValid(ExecutionContext $context)
        {
            //Do your validation here for your exemple :
            if(null === $this->citizenshipNumber && null === $this->citizenshipNumberIssuedDate) {
                $context->addViolationAtSubPath('citizenshipNumberIssuedDate', 'The date is required', array(), null);
            }
        }
    }
    

    【讨论】:

    • 我真正需要的是在 (null == $this->citizenshipNumber ) 时转义 @CustomAssert\MyDate。我正在使用 symfony 2.6
    • 你的评论回复你的问题if(null === $this->citizenshipNumber && null === $this->citizenshipNumberIssuedDate) { // put $context->addViolation... }
    • 在这两种情况下 if(null === $this->citizenshipNumber ) 和 if(null != $this->citizenshipNumber){} @CustomAssert\MyDate() 都在验证。
    • 有什么方法可以使用@Assert\Expression{ this.citizenshipNumber != null , @Assert\MyDate() }...如果我们在 symfony 2 中有这样的功能那就太好了.
    • 所以删除您的 /** @CustomAssert\MyDate() */ 并使用您的自定义 Assert 类在 isCitizenDateValid 方法中添加验证。
    【解决方案2】:
    Class SubjectSegment{   
    
        /**  
        *@CustomAssert\MyCitizenshipNumber()  
        */  
        private $citizenshipNumber;   
    
        /** 
        *@CustomAssert\MyDate(group={"is_my_citizenship_number"})  
        */   
        private $citizenshipNumberIssuedDate;
    
        public function getGroupSequence(){ 
            $sequence = ['SubjectSegment']; 
            if(null != $this->CitizenshipNumber){ 
              $sequence[] = 'is_my_citizenship_number'; 
            } 
            return $sequence; 
        } 
    }
    

    验证者:

    $violations = $container->get('validator')->validate($segment = new SubjectSegmet(), null,$segment->getGroupSequence() );
    

    【讨论】:

    • 如果 symfony 在 Expression 中引入 Assert 就好了。代码将是自我解释的。
    【解决方案3】:

    您可以通过两种方式存档:

    1) 回调验证器(通过类方法验证)

    2) 使用class constraint validator

    我建议第二种方式,因此您必须将验证器配置/设置为类范围,例如:

    /**
     * @Annotation
     */
    class MyCitizenshipNumber  extends Constraint {
    
    ...
    
        public function getTargets()
        {
            return self::CLASS_CONSTRAINT;
        }
    
    } 
    

    这样您就可以访问所有类字段成员

    记得将验证器放在类定义的顶部,例如:

    /**
     *@CustomAssert\MyCitizenshipNumber()
     */ 
     Class SubjectSegment{ 
    
     private $citizenshipNumber; 
    
     /**
     *@CustomAssert\MyDate()
     */ 
     private $citizenshipNumberIssuedDate;
    }
    

    希望有帮助

    【讨论】:

    • 我需要的是仅当citizenNumber 不为空时才调用constriaint MyDate .. 类约束验证器。
    • 您想在citizenNumber 验证器中调用日期验证器吗?如果是这样,请查看this。如果这是您的解决方案,您可能必须在citizenNumber 验证器中注入validator 组件
    猜你喜欢
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2011-07-19
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多