2013-02-11 6 views
3

У меня есть объект с несколькими пользовательскими валидаторы, как в:заказ Validators Symfony2 заказ

use Digital\ApplicationBundle\Validator\Constraints\ConstrainsUsername; 
use Digital\ApplicationBundle\Validator\Constraints\ConstrainsProduct; 
use Digital\ApplicationBundle\Validator\Constraints\ConstrainsGiftValid; 

/** 
* @DigitalAssert\ConstrainsGiftValid 
*/ 
class Gift 
{ 

/** 
* @DigitalAssert\ConstrainsUsername 
*/ 
private $username; 

/** 
* @DigitalAssert\ConstrainsProduct 
*/ 
private $productName; 
[...] 

Мой вопрос, как я могу установить порядок проверки ....

Я хотел бы проверить мои свойства сначала, и если свойства действительны, я хотел бы проверить, разрешено ли этим двум свойствам «быть» ...

Поэтому для моего случая требуется определенный порядок проверки подлинности.

Как это могло бы быть выполнено, пожалуйста?

Текущий выпуск мой класс валидации пинки «» ConstrainsGiftValid в перед ними; S

Любая помощь очень ценится.

ответ

1

ОК, передавая все в одном ограничении.

Это включает связывание ошибки на конкретный объект недвижимости и erroring различных сообщений для различных отказов:

public function isValid($gift, Constraint $constraint) 
{ 

    // Validate product. 
    /** @var $product Product */ 
    $product = $this->em->getRepository('DigitalApplicationBundle:Shop\Product')->findOneBy(array('name' => $gift->getProductName())); 
    if (!$product instanceof Product) { 

     $this->context->addViolationAtSubPath('username', $constraint->messageProduct, array('%string%' => $gift->getProductName()), null); 
     return false; 

    } 

    // Validate user. 
    /** @var $user User */ 
    $user = $this->em->getRepository('DigitalUserBundle:User')->findOneBy(array('username' => $gift->getUsername())); 
    if (!$user instanceof User) { 

     $this->context->addViolationAtSubPath('username', $constraint->messageUser, array('%string%' => $gift->getUsername()), null); 
     return false; 
    } 


    // Gift correct type of the item! 
    if (($product->getType() != 0) && ($user->getGender() !== $product->getType())) { 

     $this->context->addViolationAtSubPath('username', $constraint->messageType, array('%string%' => $gift->getProductName()), null); 
     return false; 

    } 

    // If already owning this product. 
    foreach ($user->getWardrobe()->getProducts() as $wardrobeProduct) { 
     if ($product == $wardrobeProduct) { 

      $this->context->addViolationAtSubPath('username', $constraint->message, array('%string%' => $gift->getProductName(), '%user%' => $gift->getUsername()), null); 
      return false; 
     } 
    } 

    return true; 
} 
1

Чтобы проверить, должны ли $username и $productName сходить вместе, вам нужно будет создать custom validation constraint.

Если вам требуется определенный порядок валидатора, и хотел бы повторно использовать проверку этих 2-х полей в коде, я думаю, что это нужно сделать, это:

Создать тип формы для {имя_пользователя и productName}.

Применить к публикации правила для этой формыТип. Вам нужно будет применить ограничения для всей формы в этом конкретном случае, если вы хотите играть с порядком проверки. Поэтому вы можете просто выбросить ошибки, если хотите, и в том порядке, в котором вы хотите.

Вы можете, наконец, внедрить что formType в вашем GiftFormType. Не забудьте использовать допустимое ограничение или установить cascade_validation вариант true для проверки встроенной формы.

+0

привет Patt У меня есть 3 пользовательских проверочные ограничения для этого ... вещи мне нужно заказать их как-то .. , который имеет приоритет .. – rat4m3n

+0

Если у вас есть 3 пользовательских ограничения проверки, валидатор будет проверять все ограничения, чтобы порядок не имел значения. – Mick

+0

Хм ... так что вы говорите, чтобы обрабатывать все в моем классе, а не делиться ими? Это действительно имеет смысл ... Я мог бы проверить это так ... но ошибки не появлялись рядом с каждым свойством, если это всего лишь 1 сбой свойства ... – rat4m3n

Смежные вопросы