【发布时间】:2014-06-09 15:26:27
【问题描述】:
当使用服务/数据映射器/域对象三重奏时,我的分页所在的正确位置被认为是什么?
例子:
- 使用一些给定条件获取端口
- 对结果进行分页
- 从视图类中了解我们所在的页面、总页数、结果数等
以下只是我现在写的东西,但它与我的应用程序相似。
class PostController extends Controller
{
function viewPosts()
{
return $this->serviceFactory
->build('post')
->getPosts($aCriteria, $this->request->_get('page'), 10);
}
}
我目前正在计算和存储每个服务中的分页参数。请注意,我没有将任何数据从控制器推送到视图。
class PostService extends AbstractService
{
public $posts;
public $iTotalPages; // This does not belong here does it?
function getPosts($aCriteria, $iPage, $iItemsPerPage)
{
$mapper = $this->dataMapperFactory->build('post');
// I do not know where to put the below
// (The parameters and the code itself)
$iCount = $mapper->count($aCriteria);
$iOffset = $iItemsPerPage * $iPage;
$this->iTotalPages = $iCount / $iItemsPerPage;
$this->posts = $mapper->find($aCriteria, $iOffset, $iOffset + $iItemsPerPage);
return $this->posts;
}
}
我的视图可以访问与我的控制器相同的模型层实例,因此我可以从视图中调用$service->iTotalPages,但感觉不对。
class PostsView extends AbstractView
{
function viewPosts()
{
$service = $this->serviceFactory->build('post');
if(count($service->posts)>0) {
$this->template->assign_var('TOTAL_PAGES', $service->iTotalPages);
$this->template->assign_vars('POSTS', $service->posts);
}
}
}
解决方案?
1) 创建分页服务,并让控制器根据需要与 post 服务交换数据?
2) 为每个服务可以包含的分页创建一个辅助类? (这样的课程会是什么样子?)
3) 向 AbstractService 添加通用分页?
4) 为我的 Repos 添加某种分页支持?
【问题讨论】:
-
如果您需要在数据库级别进行分页,您可以将条件和分页添加到您的读取存储库。就个人而言,我更喜欢首先使用 max 作为 finder 的参数(我认为它更通用)并在控制器处转换总页数、当前页(通常是 ui 术语)。
标签: php pagination domain-driven-design datamapper