Назначение клонированного объекта в классе SonataAdmin

Я хочу создать объект Game с клонированным объектом Scenario.

Create Game form:
    Name: My game
    Scenario: MyScenario (Combo box)

Основываясь на ответе на вопрос Глубокое клонирование объекта Doctrine со связанными объектами, у меня есть реализовано __clone методов.

Я использую метод __clone в методе prePersist в классе GameAdmin.

public function prePersist($game)
{
    $user = $this->container->get('security.context')->getToken()->getUser();
    $game->setAuthor($user);
    $cp = clone $game->getScenario(); //Error after add this
    $game->setScenario($cp);          //two lines
}

Я не уверен, что это подходящее место для выполнения этой операции, потому что я получаю MappingException:

The class 'Doctrine\ORM\Persisters\ManyToManyPersister' was not found in the chain 
configured namespaces Sonata\MediaBundle\Entity, FOS\UserBundle\Entity, 
Sonata\UserBundle\Entity, Application\Sonata\MediaBundle\Entity, 
Application\Sonata\UserBundle\Entity, GM\AppBundle\Entity

person winnfield    schedule 26.06.2013    source источник


Ответы (1)


В объекте Scenario у меня есть $tasks, который равен ArrayCollection. Я клонировал всю коллекцию, и это вызывало проблемы.

Клонирование каждого task в цикле решает проблему:

public function __clone()
{
    if($this->id)
    {
        $this->setId(null);
        $ta = new ArrayCollection();
        foreach($this->tasks as $task)
        {
            $ta[] = clone $task;
        }
        $this->tasks = $ta;
    }
}
person winnfield    schedule 26.06.2013
comment
Большое спасибо за публикацию вашего решения! Выручил меня. :) - person Cameron Hurd; 13.03.2014