Symfony 验证 属性 如果另一个 属性 不为空
Symfony validate a property if another property is not not blank
我有一个class
Class SubjectSegment{
/**
*@CustomAssert\MyCitizenshipNumber()
*/
private $citizenshipNumber;
/**
*@CustomAssert\MyDate()
*/
private $citizenshipNumberIssuedDate;
}
如果 citizenshipNumber 存在,我真正想做的是有效的 citizenshipNumberIssuedDate...
实现此目标的最佳方法是什么
你好,你应该看看 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);
}
}
}
您可以通过两种方式存档:
1) 回调验证器(通过 class 方法验证)
我建议第二种方式,所以你必须 configure/set 验证器到 class 范围,如:
/**
* @Annotation
*/
class MyCitizenshipNumber extends Constraint {
...
public function getTargets()
{
return self::CLASS_CONSTRAINT;
}
}
因此您可以访问所有 class 字段成员
记得将验证器放在 class 定义之上,例如:
/**
*@CustomAssert\MyCitizenshipNumber()
*/
Class SubjectSegment{
private $citizenshipNumber;
/**
*@CustomAssert\MyDate()
*/
private $citizenshipNumberIssuedDate;
}
希望对您有所帮助
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() );
我有一个class
Class SubjectSegment{
/**
*@CustomAssert\MyCitizenshipNumber()
*/
private $citizenshipNumber;
/**
*@CustomAssert\MyDate()
*/
private $citizenshipNumberIssuedDate;
}
如果 citizenshipNumber 存在,我真正想做的是有效的 citizenshipNumberIssuedDate...
实现此目标的最佳方法是什么
你好,你应该看看 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);
}
}
}
您可以通过两种方式存档:
1) 回调验证器(通过 class 方法验证)
我建议第二种方式,所以你必须 configure/set 验证器到 class 范围,如:
/**
* @Annotation
*/
class MyCitizenshipNumber extends Constraint {
...
public function getTargets()
{
return self::CLASS_CONSTRAINT;
}
}
因此您可以访问所有 class 字段成员
记得将验证器放在 class 定义之上,例如:
/**
*@CustomAssert\MyCitizenshipNumber()
*/
Class SubjectSegment{
private $citizenshipNumber;
/**
*@CustomAssert\MyDate()
*/
private $citizenshipNumberIssuedDate;
}
希望对您有所帮助
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() );