2016-08-03 3 views
0

Я изучаю Symfony, и я начал проект Symfony (2.8.8 с php 5.6) для нового клиента. У меня есть объект с этими полями (PHP DateTime объекты):Symfony валидатор и сравнение дат

/** 
* @var date 
* @ORM\Column(name="startDate", type="date") 
* @Assert\NotNull() 
* @Assert\Date() 
*/ 
private $startDate; 

/** 
* @var date 
* @ORM\Column(name="endDate", type="date") 
* @Assert\NotNull() 
* @Assert\Date() 
*/ 
private $endDate ; 

Я хочу, чтобы проверить, что дата начала ранее даты окончания. Так что я написал валидатор в моей сущности:

/** 
* @Assert\IsTrue(message="Start date must be earlier than end date".) 
*/ 
public function isStartDate() 
{ 
    return $this->startDate < $this->endDate ; 
} 

В моем контроллере, я проверяю мою форму так:

$myEntity = new MyEntity(); 
$form = $this->createForm(MyEntityType::class, $myEntity); 

try { 
    // Is form valid ? 
    if ($form->handleRequest($request)->isValid()) { 
     // Do things if form is Valid 
    } 
} 

Но результат всегда ложно, даже если STARTDATE раньше, чем ENDDATE .. Я знаю, что могу проверять даты в моем контроллере, но я хочу сделать это с помощью валидаторов Symfony. Как я могу сделать ?

+0

Для начала вы можете отлаживать код и вставлять сюда то, что вы получаете в '$ this-> startDate' и' $ this-> endDate', когда вы проверяете? –

+0

@JulienBourdic: они действительны для объектов php DateTime ... –

ответ

1

Вы можете исправить это с помощью специального обратного вызова Symfony. Для получения подробной информации, пожалуйста, проверьте номер document.

Для сценария данного, вы должны иметь обратный вызов проверки, как показано ниже:

/** 
* @Assert\Callback 
*/ 
public function validate(ExecutionContextInterface $context, $payload) { 
    if ($this->startDate < $this->endDate) { 
     $context->buildViolation('Start date must be earlier than end date') 
      ->atPath('startDate') 
      ->addViolation(); 
    } 
} 

Примечание:

  • Престол, ошибка устанавливается на пути поля (startDate).
  • Код не проверен !.
  • Используйте правильный путь для ExecutionContextInterface

Надежда это помогает!

+1

Работает, за исключением того, что аргумент $ полезной нагрузки для Symfony3, а не 2.8, и что оператор сравнения должен быть '>', а не '<'. –

+0

Хорошо, я дал фрагмент кода из моего экземпляра symfony 3. :) – Jeet