Как получить репозиторий от объекта?

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

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

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

Ответы

Ответ 1

Нет. Сущности в Doctrine 2 не должны знать менеджера сущностей или репозитория.

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

Ответ 2

Фактически может получить репозиторий в вашей организации и только во время обратного вызова жизненного цикла. Вы очень близки к этому, все, что вам нужно сделать, это получить параметр 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. Я знаю, что это старый вопрос, но я ответил ему, чтобы помочь будущим гуглерам.

Ответ 3

вы можете ввести менеджера сущности доктрины в свою сущность (с использованием 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

Ответ 4

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

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