假设我有一个父实体:
#[ORM\Entity(repositoryClass: EventRepository::class)]
class EventEntity
{
...
#[ORM\ManyToOne(targetEntity: EventStatusEntity::class)]
#[ORM\JoinColumn(name: 'status_id', referencedColumnName: 'id')]
private EventStatusEntity $status;
public setStatusDraft()
{
$this->setStatus(...?? (1) ??...); // DRAFT status has a pre-determined ID="1"
}
...
}
如何实现setStatusDraft? 我应该注入一个entityManager并使用getReference,还是注入EventStatusRepository并使用findOneById?
对我来说,这似乎是一个很常见的情况,但到目前为止我还没有找到答案。我知道我可能应该引入一个服务层,但这项任务不值得付出努力。我非常愿意将这个简单的功能添加到 Doctrine 实体中。
实体应该尽可能“简单”。避免在实体中注入 EntityManager 等服务。
我反对简单的服务太过分的假设。
此时您可能只在一个地方设置状态,但如果将来您想在其他地方设置状态怎么办?拥有一项您可以轻松完成的服务(从代码中的任何位置);
$this->eventStatusService->setStatusDraft('draft');
更容易、更快、更易于维护,并且不违背最佳实践。举个例子,编写下面的服务花了几秒钟,比打开 StackOverflow 并编写一个新问题所需的时间还要少。
class EventStatusService
{
public function __construct(private EntityManagerInterface $entityManager) {}
public function setStatusDraft(EventEntity $event): void
{
$draftStatus = $this->entityManager->getReference(EventStatusEntity::class, 1);
$event->setStatus($draftStatus);
}
}
有关 Doctrine 关系、设置和获取数据的更多信息,请参阅 Symfony 的文档:https://symfony.com/doc/current/doctrine/associations.html#more-information-on-associations