Amy*_*y B 18 symfony doctrine-orm
我有一个实体,调用Game
了一个名为的相关存储库GameRepository
:
/**
* @ORM\Entity(repositoryClass="...\GameRepository")
* @ORM\HasLifecycleCallbacks()
*/
class Game {
/**
* @ORM\prePersist
*/
public function setSlugValue() {
$this->slug = $repo->createUniqueSlugForGame();
}
}
Run Code Online (Sandbox Code Playgroud)
在prePersist方法中,我需要确保Game的slug字段是唯一的,这需要数据库查询.要进行查询,我需要访问EntityManager
.我可以从GameRepository中获取EntityManager.那么:我如何从游戏中获取GameRespository?
Mau*_*ice 57
实际上,你可以让你的实体,仅在一个生命周期回调的存储库.你非常接近它,你所要做的就是接收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();
}
}
Run Code Online (Sandbox Code Playgroud)
PS.我知道这是一个老问题,但我回答它是为了帮助任何未来的googlers.
你没有.Doctrine 2中的实体应该不知道实体管理器或存储库.
您提供的案例的典型解决方案是将方法添加到用于创建(或调用存储)新实例的存储库(或服务类),并且还生成唯一的段塞值.