【发布时间】:2016-10-10 04:00:31
【问题描述】:
我正在开发一个页面,用户可以在其中查看代表 Internet 流量进出网络设备端口的图形图像概览。有关这些端口的信息收集在一个表中。该表的每个端口至少包含以下列:
- 端口号
- 设备 ID
- 端口名称
- 还有更多...
设备 ID 列是另一个表的主键:设备。该表至少有以下列:
- 设备 ID
- 设备名称
- 还有更多...
如您所见,这两个表之间存在设备 ID 关系。我已将这两个表都翻译为域对象“端口”和“设备”。两个域对象都由两个域映射器“PortMapper”和“DeviceMapper”填充。我需要每个端口的一个属性是我可以通过设备 ID 获得的设备名称。我的问题是如何最好地将这两个域对象映射在一起。
我的 PortMapper 的 findById() 函数如下所示:
public function findById($id, DeviceMapper $deviceMapper) {
$ports = $this->db->sql_select('SELECT * FROM ports WHERE customer_id = ?', [$id]);
$arrayOfPorts = [];
foreach($ports as $port) {
$device = $deviceMapper->findById($port['device_id']);
$port['device'] = $device;
$arrayOfPorts[] = $this->createObject($port);
}
return $arrayOfPorts;
}
还有我的 DeviceMapper 的 findById() 函数:
public function findById($id) {
$device = $this->db->sql_select('SELECT * FROM devices WHERE device_id = ?', [$id]);
return $this->createObject($device);
}
我在控制器中实例化它的方式:
$db = new Database('librenms');
$portMapper = new PortMapper($db);
$deviceMapper = new DeviceMapper($db);
$ports = $portMapper->findById($_SESSION['user']['id'], $deviceMapper);
foreach($ports as $port) {
echo $port->getHostname();
}
我得到每个端口的设备主机名就好了。但是我实例化整个事情的方式真的很糟糕。对于两个域对象之间的关系,有什么更好的方法?
我可以做一个简单的 LEFT JOIN 查询,这样我就不需要将两个域对象映射在一起,但这不是我想去的地方。
【问题讨论】:
-
你为什么不用像Doctrine ORM这样的ORM框架?
-
通过编写自己的代码,我学到的不仅仅是使用像 Doctrine 这样的大型 ORM 框架。
-
足够好。然后按照 Doctrine 或其他框架使用的模式自己实现功能。
-
我来看看 Doctrine ORM。
标签: php oop design-patterns datamapper