您要做的是混合两种设计模式:Active Record和Data Mapper。
如果您查看 Data Mapper 模式,您将拥有同时访问模型和数据库的 Mapper。该模型是被动的 - 通常不调用外部资源(它是一个 POPO - 普通旧 PHP 对象)。
您的问题的解决方案是将相关信息注入模型中,从而将模型仅保留为数据结构。
这是 MVC 应用程序的工作场景:
控制器- 用于输入验证和从服务中检索数据
<?php
...
public function viewAction()
{
$id = (int) $this->params()->fromQuery('id');
$service = $this->getServiceLocator()->get('your-user-service-name');
$user = $service->getUser($id);
...
}
服务——用于执行业务逻辑;调用多个数据映射器
<?php
...
public function getUser($id)
{
// get user
$mapper = $this->getServiceLocator()->get('your-user-mapper');
$user = $mapper->getUserById($id);
// get articles
$article_mapper = $this->getServiceLocator()->get('your-article-mapper');
$user->articles = $article_mapper->getArticlesByUser($id);
return $user;
}
数据映射器- 用于操作一种类型的域实体 - 如果您正在访问数据库,它应该由 tableGateway 组成
<?php
...
public function getUserById($id)
{
$select = $this->tableGateway->getSql()->select();
$select = $select->where(array('id' => $value));
$row = $this->tableGateway->selectWith($select)->current();
return $row;
}
领域模型- 用于数据表示
<?php
...
class User
{
public $name; // user name
...
public $articles; // holds the user articles
}
优点
- 被动模型易于阅读 - 了解数据结构及其关系。
- 被动模型很容易测试——你不需要外部依赖。
- 您将持久层与域层分开。
希望这可以帮助!