推荐使用KnpPaginatorBundle实现Symfony 2.8.52分页,需手动安装注册、控制器显式传入Request对象、正确调用paginate()四参数方法,并通过第五参数透传非分页查询参数,模板中按约定变量名和属性名渲染。

Symfony 2.8.52 中实现数据分页,推荐使用 KnpPaginatorBundle,它轻量、稳定、与 Doctrine 兼容良好,且对老版本 Symfony 支持完善。手写 OFFSET/LIMIT 容易出错,也不处理链接参数透传和模板渲染,不建议。
安装与注册必须一步不漏
该版本不支持自动包注册,需手动配置:
- 执行
composer require knplabs/knp-paginator-bundle(注意不是knp_paginator_bundle) - 打开
app/AppKernel.php,在registerBundles()方法中添加:new Knp\Bundle\PaginatorBundle\KnpPaginatorBundle(), - 确保
config.yml或services.yml中已启用 Twig 扩展(默认开启):knplabs_knp_paginator: ~
控制器里正确调用 paginate() 方法
2.8.52 不支持依赖注入 Request 自动解析,必须显式传入请求对象:
- 方法签名要带
Request $request参数(不能省略) -
paginate()四个参数顺序固定:
查询对象(QueryBuilder或Query)、当前页码、每页数量、$request - 示例代码:
$qb = $em->getRepository('AppBundle:Post')->createQueryBuilder('p');
$pagination = $paginator->paginate(
$qb,
$request->query->get('page', 1),
10,
$request
);
⚠️ 错误写法:$paginator->paginate($qb, 1, 10) 会报 ArgumentCountError;也不能传空数组或 null 替代 $request。
保留搜索/筛选等额外查询参数
默认只保留 page、sort、direction,其他如 q=php、status=draft 会被丢弃:
- 在
paginate()调用时加第 5 个参数(选项数组),指定要透传的键名:['page' => 'page', 'q' => 'q', 'status' => 'status'] - 更通用做法:动态提取非分页参数:
array_diff_key($request->query->all(), ['page' => 1, 'sort' => 1, 'direction' => 1]) - 确保路由使用
path()+ 查询字符串,不要用纯路径硬编码
模板中安全渲染分页导航
Twig 变量名必须匹配,属性名有约定:
- 控制器返回变量名必须是
pagination,否则{{ knp_pagination_render() }}找不到对象;多个分页需显式传参,如{{ knp_pagination_render(users) }} - 遍历数据用
{% for item in pagination %},不是pagination.items - 获取当前页码用
pagination.currentPageNumber,总条数用pagination.totalItemCount(注意不是totalCount) - 分页 HTML 渲染直接写:
{{ knp_pagination_render(pagination) }}


















