Как получить репозиторий от объекта?
У меня есть 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 пакеты, которые могут выполнять только то, что вам нужно.