【发布时间】:2020-02-26 20:50:50
【问题描述】:
我们正在努力寻找在一个有相当具体问题的 Symfony 项目中实现依赖注入的最佳方法。
在用户级别,我们的应用程序依赖于一个“帐户”原则实体,该实体在 HTTP_HOST 全局属性的帮助下加载到域属性(多域应用程序)。继续域 example.domain.tld 将加载匹配的实体和设置。
在 devops 级别,我们还需要同时在多个帐户上使用 CLI 脚本进行批处理。
我们面临的问题是如何编写能够同时满足这两种需求的服务?
让我们用一个简化的例子来说明这一点。对于用户级别,我们有这个,一切都很好:
控制器/文件控制器.php
public function new(Request $request, FileManager $fileManager): Response
{
...
$fileManager->addFile($file);
...
}
服务/FileManager.php
public function __construct(AccountFactory $account)
{
$this->account = $account;
}
服务/AccountFactory.php
public function __construct(RequestStack $requestStack, AccountRepository $accountRepository)
{
$this->requestStack = $requestStack;
$this->accountRepository = $accountRepository;
}
public function createAccount()
{
$httpHost = $this->requestStack->getCurrentRequest()->server->get('HTTP_HOST');
$account = $this->accountRepository->findOneBy(['domain' => $httpHost]);
if (!$account) {
throw $this->createNotFoundException(sprintf('No matching account for given host %s', $httpHost));
}
return $account;
}
现在如果我们想编写以下控制台命令,它会失败,因为 FileManager 只接受 AccountFactory 而不是帐户实体。
$accounts = $accountRepository->findAll();
foreach ($accounts as $account) {
$fileManager = new FileManager($account);
$fileManager->addFile($file);
}
我们可以调整 AccountFactory 但这会感觉不对...
实际上,这甚至更糟,因为 Account 依赖于服务更深。
有人知道如何正确地做到这一点吗?
【问题讨论】:
-
引入一个通用接口怎么样?
-
@NicoHaase 你将如何创建一个教义实体的通用接口?
-
我不明白这个问题 - Doctrine 实体和所有其他实体一样是 PHP 类
-
@NicoHaase 那我不明白你所说的通用接口是什么意思:)
-
您编辑实体类,并在它显示
class EntityXY的那一行中追加class EntityXY implements CommonInterface- 现在,公共类可以依赖该接口,并且两个更改类都实现了公共接口所有常用方法
标签: php symfony doctrine-orm symfony4