【发布时间】:2013-04-18 20:25:46
【问题描述】:
解决this question 中提出的问题的解决方案,其中客户端实体被拆分为两个数据库 - 一个本地,一个外部,是构建本地客户端,使其包含作为对象的外部客户端并具有 getter/setter维护外部客户端对象。本地关系在本地 Client 实体中维护。现在的问题是如何最好地创建客户端实体,以便它可以在多个地方使用。
当前客户端控制器方法
public function getClient($id = null) {
if (!empty($id)) {
$localEm = $this->getDoctrine()->getManager();
$foreignEm = $this->getDoctrine()->getManager('split');
$client = $localEm->getRepository('ManaClientBundle:Client')->find($id);
$foreignId = $client->getCid();
$foreignClient = $foreignEm->getRepository('ManaSplitBundle:Client')->find($foreignId);
$client->setForeignClient($foreignClient);
} else {
$client = new Client();
$client->setForeignClient(new ForeignClient());
}
return $client;
}
尝试在客户端存储库中执行此操作或类似操作失败。正如尝试将以下服务注入独立类一样。这将失败,并出现有关缺少构造函数的参数 1 的错误。
services.yml sn-p:
foreign_client:
class: Mana\ClientBundle\DataCombine\ClientCombine
arguments:
localEm: @doctrine.orm.entity_manager
foreignEm: @doctrine.orm.split_entity_manager
ClientCombine 类 sn-p:
namespace Mana\ClientBundle\DataCombine;
use Doctrine\ORM\EntityManager;
class ClientCombine {
private $localEm;
private $foreignEm;
public function __construct(EntityManager $localEm, EntityManager $foreignEm) {
$this->localEm = $localEm;
$this->foreignEm = $foreignEm;
}
...
}
【问题讨论】:
-
“在多个地方使用”是什么意思?
-
@Lighthart:需要访问客户端实体的控制器不止一个。例如,客户端联系人通过 ContactController 进行管理。你的问题让我怀疑我是否过度设计了这个东西。
-
您已经对此进行了一段时间的研究,我正在尝试了解它与您的其他问题的关系......但实体就是实体。所有控制器都可以访问它,前提是所有控制器都可以访问所有存储库(这将是“正常的”......)
-
如果我可以在存储库中构建这个混合客户端,所有控制器都可以访问。据我所知,不可能将参数传递给将构建实体的自定义存储库函数。如果可能的话,我真的很想看到。在实体内部使用实体管理器似乎是不合适的;这样做可以解决问题