2015-12-13 2 views
4

Я пытаюсь создать объект адреса с почтовым кодом, утвержденным на основе данной страны. Способ перехода - это, очевидно, CallbackValidator. На данный момент у меня есть этот код:Symfony/Validator: проверка свойства в обратном вызове

use SLLH\IsoCodesValidator\Constraints\ZipCode; 
use Symfony\Component\Validator\Constraints\Callback; 
use Symfony\Component\Validator\Context\ExecutionContextInterface; 

class Address 
{ 
    /** 
    * @Callback() 
    */ 
    public function validatePostalCode(ExecutionContextInterface $context) 
    { 
     $constraint = new ZipCode([ 'country' => $this->country ]); 
     $violations = $context->getValidator()->validate($this->postalCode, $constraint); 

     foreach ($violations as $violation) { 
      $context->getViolations()->add($violation); 
     } 
    } 
} 

Проблема в том, что нарушения не имеют правильного пути. Я не знаю, как это установить. Также $context->buildViolation($violation->getMessage()) не очень хорошо, потому что мне придется вручную скопировать все свойства, которые могут иметь нарушения.

EDIT: Я пробовал, и это действительно very ugly.

ответ

1

Это похоже на работу. Дело в том, что вы можете указать путь проверки, если используете контекстный валидатор. Также вам не нужно дублировать нарушения, поскольку они добавляются непосредственно в предполагаемый контекст.

/** 
* @Callback() 
*/ 
public function validatePostalCode(ExecutionContextInterface $context) 
{ 
    $constraint = new ZipCode([ 'country' => $this->country ]); 
    $validator = $context->getValidator()->inContext($context); 
    $validator->atPath('postalCode')->validate($this->postalCode, $constraint, [Constraint::DEFAULT_GROUP]); 
} 
Смежные вопросы