如何从实体获取存储库?

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.

  • 我很高兴你复活了它 - 我是未来的Google员工之一.我实际上已经在生命周期回调中工作并且依赖于创建或获取相关对象来持久化我的对象. (6认同)
  • Working for me ( Symfony 2.4), I think this one would be the accepted answer ! (2认同)
  • @TrtG,您可以使每个动作实体只有一个侦听器。然后从`if(!$ entity instanceof SomeEntity :: class){return;}`开始您的监听器方法。如果您需要监听另一个实体的同一事件,则可以创建另一个监听器。我要给每个听众一个责任。 (2认同)

Jan*_*nen 8

你没有.Doctrine 2中的实体应该知道实体管理器或存储库.

您提供的案例的典型解决方案是将方法添加到用于创建(或调用存储)新实例的存储库(或服务类),并且还生成唯一的段塞值.

  • 他们为什么选择那样做?它似乎使一切都变得更加困难,更少干. (2认同)
  • 存储库中的一种“创建新实例”的方法...真的吗?仓库不是只获取数据吗? (2认同)