You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"

核心原因

  1. 控制器传参错误:调用paginator->paginate()时错误地将参数包装成数组,导致Knp Paginator无法正确识别数据源。
  2. 查询结果类型不匹配: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 18:30:36