Knp Paginator与Symfony 5兼容问题:访问user.id抛出异常
修复Knp Paginator访问user.id时的错误
问题场景
在Symfony 5环境中使用Knp Paginator 5.8.0(PHP 8.0),尝试在模板中访问user.id时抛出错误:
Neither the property "id" nor one of the methods "id()", "getid()"/"isid()"/"hasid()" or "__call()" exist and have public access in class "Doctrine\ORM\Query"
核心原因
- 控制器传参错误:调用
paginator->paginate()时错误地将参数包装成数组,导致Knp Paginator无法正确识别数据源。 - 查询结果类型不匹配:Repository中使用部分字段查询时,Doctrine返回关联数组而非实体对象,直接用属性访问会报错;同时原代码未正确传递查询对象给分页器。
修复方案
1. 修正控制器分页调用逻辑
Knp Paginator的paginate()方法接受三个独立参数,无需包装为数组。修改控制器代码:
namespace App\Controller\Frontend; use App\Controller\BaseController; use App\Entity\User; use Knp\Component\Pager\PaginatorInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; class HomepageController extends BaseController { /** * @Route("/", name="homepage") */ public function homepageAction(PaginatorInterface $paginator, Request $request) { $usersQuery = $this->getDoctrine()->getRepository(User::class)->getUsers(); // 正确调用分页方法:数据源、当前页码、每页数量 $pagination = $paginator->paginate( $usersQuery, $request->query->getInt('page', 1), // 从URL获取页码,默认第1页 10 // 每页显示10条,可按需调整 ); return $this->render('frontend/homepage.html.twig', [ 'users' => $pagination ]); } }
2. 调整查询结果的访问方式
情况一:保留部分字段查询
如果需要只查询id和email,Repository代码不变,模板中需用数组索引访问字段:
{% for user in users %} <p>ID: {{ user['id'] }},邮箱: {{ user['email'] }}</p> {% endfor %}
情况二:返回实体对象(支持属性访问)
若希望在模板中用user.id这种属性访问方式,修改Repository查询,去掉select()语句以返回完整User实体:
public function getUsers() { return $this->createQueryBuilder('u') ->orderBy('u.createdAt', 'DESC') ->getQuery(); }
此时模板中可正常使用:
{% for user in users %} <p>ID: {{ user.id }},邮箱: {{ user.email }}</p> {% endfor %}
3. 验证Knp Paginator配置
确保config/packages/knp_paginator.yaml中Doctrine ORM驱动已启用:
knp_paginator: page_range: 5 default_options: page_name: page sort_field_name: sort sort_direction_name: direction distinct: true template: pagination: '@KnpPaginator/Pagination/twitter_bootstrap_v4_pagination.html.twig' sortable: '@KnpPaginator/Pagination/sortable_link.html.twig' doctrine: orm: true
内容的提问来源于stack exchange,提问作者thexcoach
相关产品推荐
相关产品推荐

