2013-10-19 131 views
1

我正在編寫一個REST API,我的問題是當我想在一個與其他實體有一對多關係的實體中反序列化請求時,因爲當我想要持久化對象,而不是將現有的「孩子」放在一起,教義創建一個新的,並將他分配給對象。Synfony自定義驗證器在驗證中改變對象值

下面是一個職位例如:

{ 「類別」:{ 「ID」:1},{ 「主題」:{ 「ID」:1}}

我預計會發生,是添加一個新類別:1和主題:1,但相反主義創建一個新的類別/主題。

我想要做的就是改變通過自定義驗證內的學說對象與JMS串行解串創建的類/主題對象,

class Channel 
{ 

    /** 
    * @ChoiceEntity(targetEntity="Bundle\ChannelBundle\Entity\ChannelCategory", allowNull=true) 
    * @Type("Bundle\ChannelBundle\Entity\ChannelCategory") 
    */ 
    public $category; 

    /** 
    * @ChoiceEntity(targetEntity="Bundle\ChannelBundle\Entity\Theme", allowNull=true) 
    * @Type("Bundle\ChannelBundle\Entity\Theme") 
    */ 
    public $theme; 
} 

這裏自定義驗證:

class ChoiceEntityValidator extends ConstraintValidator 
{ 
    /** 
    * 
    * @var type 
    */ 
    private $entityManager; 

    /** 
    * 
    * @param type $entityManager 
    */ 
    public function __construct($entityManager){ 
     $this->entityManager = $entityManager;  
    } 

    /** 
    * @param FormEvent $event 
    */ 
    public function validate($object, Constraint $constraint) 
    { 
     if($constraint->getAllowNull() === TRUE && $object === NULL){//null allowed, and value is null 
      return; 
     } 

     if($object === NULL || !is_object($object)) { 
      return $this->context->addViolation($constraint->message); 
     } 

     if(!$this->entityManager->getRepository($constraint->getTargetEntity())->findOneById($object->getId())) { 
      $this->context->addViolation($constraint->message); 
     }  
    } 
} 

那麼有沒有一種方法可以通過存儲庫結果中的值更改自定義驗證器中的$對象?

回答

3

我不認爲在自定義驗證器中編輯驗證的對象是個好主意。

記住您添加自定義驗證應該用來檢查你的對象是有效還是無效(取決於您的驗證規則)。

如果要編輯對象,則應在調用驗證過程之前執行該操作。您可能需要使用Data Transformers

+0

好點,我不知道數據變形金剛,這就是爲什麼我想這樣做,但我知道這不是一個最佳實踐,謝謝! –