Как получить хранилище от сущности? - PullRequest
18 голосов
/ 18 сентября 2011

У меня есть сущность с именем Game и связанный репозиторий с именем GameRepository:

/**
 * @ORM\Entity(repositoryClass="...\GameRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Game {
    /**
     * @ORM\prePersist
     */
    public function setSlugValue() {
        $this->slug = $repo->createUniqueSlugForGame();
    }
}

В методе prePersist мне нужно убедиться, что поле slug в игре уникально и требует запроса к базе данных. Для выполнения запроса мне нужен доступ к EntityManager. Я могу получить EntityManager из GameRepository. Итак: как мне получить GameRespository из игры?

Ответы [ 4 ]

55 голосов
/ 10 марта 2014

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

Также см. http://docs.doctrine -project.org / projects / doctrine-orm / en / latest / reference / events.html

use Doctrine\ORM\Event\LifecycleEventArgs;

/**
 * @ORM\Entity(repositoryClass="...\GameRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Game {
    /**
     * @ORM\prePersist
     */
    public function setSlugValue( LifecycleEventArgs $event ) {
        $entityManager = $event->getEntityManager();
        $repository    = $entityManager->getRepository( get_class($this) );

        $this->slug = $repository->createUniqueSlugForGame();
    }
}

PS. Я знаю, что это старый вопрос, но я ответил на него, чтобы помочь любым будущим гуглерам.

8 голосов
/ 18 сентября 2011

Ты не. Предполагается, что сущности в Doctrine 2 не знают о менеджере сущностей или хранилище.

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

4 голосов
/ 06 февраля 2013

вы можете внедрить менеджера сущностей доктрины в вашу сущность (используя JMSDiExtraBundle) и иметь хранилище так:

/**
 * @InjectParams({
 *     "em" = @Inject("doctrine.orm.entity_manager")
 * })
 */
    public function setInitialStatus(\Doctrine\ORM\EntityManager $em) {


    $obj = $em->getRepository('AcmeSampleBundle:User')->functionInRepository();
    //...
}

см. Это: http://jmsyst.com/bundles/JMSDiExtraBundle/1.1/annotations

1 голос
/ 18 сентября 2011

Чтобы сохранить логику в инкапсуляции, не изменяя способ сохранения сущности, вместо простого события жизненного цикла prePersist вам нужно будет использовать более мощные события Doctrine, которые могут получить доступ не только к сущности.сам.

Вам, вероятно, стоит взглянуть на DoctrineSluggableBundle или StofDoctrineExtensionsBundle пакетов, которые могут делать именно то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...