我会说请求对象不应该比控制器更深入堆栈。
没有什么能阻止您将分页器直接注入您的自定义存储库,那么为什么不这样做呢?
your.repository.service.definition:
class: Your\Repository\Class
# for symfony 2.3
factory_service: doctrine
factory_method: getRepository
# for symfony 2.8 and higher
factory: ["@doctrine.orm.entity_manager", getRepository]
arguments:
- YourBundle:YourEntity
calls:
- [setPaginator, ["@knp_paginator"]]
在存储库中,您应该拥有可用于 QueryBuilder 的分页器:
public function setPaginator($paginator)
{
$this->paginator = $paginator;
}
...
$this->paginator->paginate($qb->getQuery(), $page, $limit);
为了将您的$page
和$limit
变量放入存储库,您不需要 Request 对象。只需将它们作为参数传递给存储库调用:
// In your controller
// You can use forms here if you want, but for brevity:
$criteria = $request->get('criteria');
$page = $request->get('page');
$limit = $request->get('limit');
$paginatedResults = $myCustomRepository->fetchPaginatedData($criteria, $page, $limit);
将请求对象进一步向下传递到控制器意味着您的抽象中有泄漏。您的应用程序无需关心 Request 对象。实际上,该请求很可能来自其他来源,例如 CLI 命令。由于抽象级别错误,您不想从那里创建 Request 对象。