【发布时间】:2020-10-11 07:23:45
【问题描述】:
在 Symfony 5 中,假设我们有 3 个这样链接的实体:
-
Foo是一个以Bar为子实体的实体。Foo作为一个名为fooProperty的属性。 -
Bar将Foo作为父级,Baz作为子级 -
Baz当然有 Bar 作为父母。Baz拥有一个名为bazProperty的属性。
假设bazProperty 的值取决于fooProperty 的值。我的第一个想法是在baz 实体类中引用foo 实体:
function setBazProperty($value) {
if ($this->getBar()->getFoo()->getFooProperty > 0) {
$this->bazProperty = $value;
} else {
$this->bazProperty = 0;
}
}
但这会发生很多 sql 查询,因为 Doctrine 会首先要求获取 Bar 实体,然后是 Foo 实体。
所以我想通过存储库类中管理的唯一查询来访问Foo 实体。
但是,由于the separation of concern,我不会在Baz 实体中注入存储库,而是使用服务。
所以我在构造函数中创建了一个带有两个参数的BazService:
public function __construct(Baz $baz, BazRepository $bazRepository)
{
$this->baz = $baz;
$this->bazRepository= $bazRepository;
}
在这个服务中,我还添加了一个获取Foo实体的方法:
public function getFoo()
{
return $this->bazRepository->getFoo($this->baz);
}
最后,在控制器中,现在我想获得Foo 实体:
$bazService = new BazService($baz);
$foo = $bazService->getFoo();
这是我的问题:
-
我无法在控制器中初始化
bazService。构造函数要求 2 个参数(实体和存储库),我只想提供实体并自动注入存储库类。 我试图在 serices.yaml 中添加它但没有成功(可能是因为我没有在控制器的构造函数中实例化bazService):App\Service\BazService: arguments: $bazRepository: App\Repository\BazRepository
还有其他解决方案吗?如何在服务类中以不同方式注入实体类?
【问题讨论】:
-
非常自以为是的问题;o/
-
我同意这个问题有点具体,但我面临一个真正的问题是更新依赖于父属性的属性。我想用最优雅的方案写出干净全面的代码。
-
附带说明:如果需要创建实体,我发现“服务”有点臭。恕我直言,语法应该是
$bazService->getFoo($baz)。然后,在您的控制器中,您可以通过控制器方法签名请求BazService并通过依赖注入获取它。 -
我同意你的看法。在使用服务时将实体作为参数传递似乎不太方便。我还尝试创建一个扩展实体
baz的类bazService。但这在持久化实体时会导致问题,并且不能解决关注点分离问题。
标签: symfony service repository entity