2017-11-21 13 views
1

Assert \ Expression을 내 엔터티의 속성에 추가하고 싶습니다. 선택한 "유효 날짜"(this.getEffective())가 과거 또는 오늘이면 오류 메시지가 나타나야합니다. 나는 그 날짜를 오늘날의 날짜와 어떻게 비교할 수 있을지 알 수 없다. Symfony Assert Expression은 오늘 날짜와 엔터티 속성을 비교합니다.

/** 
* @var boolean 
* @ORM\Column(type="boolean", nullable=true) 
* @Assert\Expression(
*  "this.getEffective() > today", 
*  message="The effective date must be in the future!") 
*/ 
private $status_stealth; 

나는 지금 또는 datetime.now()와 같은 시도하고 나는 많은 주위에 구글을했습니다,하지만 난 누군가가 실제로 현재 날짜에서와 다른 값을 비교 아무것도 발견하지 않았습니다 어설트 식.

아이디어가 있으십니까?

답변

1

당신은 기본적으로

/** 
* @var boolean 
* @ORM\Column(type="boolean", nullable=true) 
* @Assert\Expression(
*  "this.getEffective() > this.getCurrentDate()", 
*  message="The effective date must be in the future!") 
*/ 
private $status_stealth; 

public function getCurrentDate(){ 
    return new \DateTime(); 
} 
+0

'DateTimeImmutable'을 사용하는 것이 좋습니다. –

+0

@OlegBelostotsky 어떻게 작동합니까? – sonja

+0

@M Khalid Junaid, status_stealth가 실제로 확인되었는지 여부도 확인할 수 있습니까? 이렇게 말하면 : "this.getStatusStealth() == true 및 this.getEffective()> this.getCurrentDate()" 아직 작동하지 않지만 왜 그럴 수 없습니까? – sonja

0

귀하의 비교 할 오늘 날짜의 시간을 반환하고 표현됩니다 기업에 대한 새로운 방법을 정의 할 수 있습니다, 식 구문은 하나의 기능, constant()을 지원합니다. 차례로, expression validator는 하나 또는 두 개의 변수 (유효성 검사 값과 컨텍스트 객체)를 제공합니다. 엔터티의 유효성 검사 메서드에 값을 전달할 수 있습니다.

/** 
* @Assert\Expression(expression="this.isStatusValid(value)") 
*/ 
private $status; 

public function isStatusValid($status) { 
    $currentDate = new \DateTimeImmutable(); 
    return in_array($status, [1, 2, 3]) && $this->targetDate > $currentDate; 
} 

오류가 발생하면 디버그하십시오.

public function isStatusValid($status) { 
    $currentDate = new \DateTimeImmutable(); 
    var_dump($this->targetDate); 
    var_dump($currentDate); 
    die(); 
    return in_array($status, [1, 2, 3]) && $this->targetDate > $currentDate; 
} 

문서 링크 : Expression Constraint, Expression Syntax.