Dov*_*ius 6 registry containers code-injection symfony doctrine-orm
将存储库、实体管理器注入服务的最佳实践是什么?
我想我至少可以通过三种方式做到这一点。
这样就可以很容易地通过测试覆盖服务。您所需要做的就是将模拟的依赖项传递给构造函数,然后您就准备好了。
class TestService
{
public function __construct(MyEntityRepository $my, AnotherEntityRepository $another, EntityManager $manager)
{
$this->my = $my;
$this->another = $another;
$this->manager = $manager;
}
public function doSomething()
{
$item = $this->my->find(<...>);
<..>
$this->manager->persist($item);
$this->manager->flush();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您需要来自同一管理器的 4 个存储库,则测试起来会有点困难。我认为这样你必须模拟经理的 getRepository 调用。
class TestService
{
public function __construct(EntityManager $manager)
{
$this->manager = $manager;
}
public function doSomething()
{
$item = $this->manager->getRepository('my')->find(<...>);
<..>
$this->manager->persist($item);
$this->manager->flush();
}
}
Run Code Online (Sandbox Code Playgroud)
这样,您就不会遇到教义事件订阅者的循环引用异常,但模拟所有内容会更困难。
这也是 sensiolabs Insights 不会给我带来注入 EntityManager 架构违规的唯一方法。
class TestService
{
public function __construct(RegistryInterface $registry)
{
$this->doctrine = $registry;
}
public function doSomething()
{
$item = $this->registry->getManager()->getRepository('my')->find(<...>);
<..>
$this->registry->getManager()->persist($item);
$this->registry->getManager()->flush();
}
}
Run Code Online (Sandbox Code Playgroud)
执行此操作的最佳做法是什么?为什么?
| 归档时间: |
|
| 查看次数: |
5294 次 |
| 最近记录: |