1

我正在编写一个 REST API,我的问题是当我想反序列化与其他实体具有一对多关系的实体中的请求时,因为当我想要持久化对象而不是现有的“子”时,Doctrine创建一个新的并将他分配给该对象。

这是一个帖子示例:

{“类别”:{“id”:1},{“主题”:{“id”:1}}

我期望发生的是添加一个具有类别:1 和主题:1 的新频道,但学说创建了一个新的类别/主题。

我想做的是更改通过在自定义验证器中的 Doctrine 对象中使用 JMS Serializer 反序列化创建的类别/主题对象,

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);
        }       
    } 
}

那么有没有办法使用存储库结果中的值更改自定义验证器中的 $object ?

4

1 回答 1

3

我不认为在您的自定义验证器中编辑已验证的对象是一个好主意。

请记住,您添加的自定义验证器应用于检查您的对象是否有效(取决于您的验证规则)。

如果要编辑对象,则应在调用验证过程之前进行。您可能需要使用Data Transformers

于 2013-10-19T12:58:09.317 回答