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

Laravel LengthAwarePaginator泛型实现:IDE无法识别items返回类型

解决Laravel自定义分页器泛型类型识别问题

核心解决方案:完善泛型PHPDoc注释并明确方法返回类型

1. 给自定义分页器类添加泛型声明

在你的MyPaginator类上添加泛型模板注释,明确继承的父类泛型参数,并重写items()方法指定返回类型:

<?php

use Illuminate\Pagination\LengthAwarePaginator;

/**
 * @template T of object
 * @extends LengthAwarePaginator<T>
 */
class MyPaginator extends LengthAwarePaginator
{
    /**
     * @return array<T>
     */
    public function items(): array
    {
        return parent::items();
    }
}
  • @template T of object 定义泛型参数T,限制为对象类型
  • @extends LengthAwarePaginator<T> 声明父类的泛型参数为T
  • 重写items()方法并标注返回array<T>,让IDE明确返回的是指定类型的数组

2. 在返回分页器的方法中指定具体泛型类型

在控制器或服务类的方法里,明确返回MyPaginator<CampaignTemplateListDto>类型:

/**
 * @return MyPaginator<CampaignTemplateListDto>
 */
public function getCampaignTemplates(): MyPaginator
{
    // 示例:从数据库获取数据并转换为DTO集合
    $templates = CampaignTemplate::query()
        ->paginate(10)
        ->getCollection()
        ->map(fn($model) => new CampaignTemplateListDto($model));

    return new MyPaginator(
        $templates,
        CampaignTemplate::count(),
        10,
        request()->get('page', 1)
    );
}

这样PhpStorm就能识别调用items()时返回的是CampaignTemplateListDto[]类型。

3. 检查PhpStorm配置确保泛型支持

  • 打开PhpStorm设置,进入Languages & Frameworks > PHP,确保勾选了Enable generics in PHP(新版本默认开启)
  • 确保Laravel插件是最新版本,避免插件对Laravel分页器的泛型识别不兼容

额外提示(Laravel 9+)

Laravel 9及以上版本的LengthAwarePaginator本身已经原生支持泛型,你可以直接在自定义类中使用原生泛型语法,无需依赖PHPDoc:

class MyPaginator<T> extends LengthAwarePaginator<T>
{
    public function items(): array
    {
        return parent::items();
    }
}

然后在返回方法中直接声明MyPaginator<CampaignTemplateListDto>,IDE会自动识别类型。


内容的提问来源于stack exchange,提问作者Chris White

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:24:55