Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

mallaury's avatar

Format pagination metadata for all collections (API)

Hello, I'd like to format the pagination of all my Api Resources without having to create a "Collection" class for each Model.

I'd like to do it like this:

class UserCollection extends ResourceCollection
{
    public function toArray($request)
    {
        return [
            'data' => $this->collection->transform(function (User $user) {
                return new UserResource($user);
            }),
            'meta' => [
                'total_users' => $this->collection->count(),
            ],
        ];
    }
}

For User, Post, Category models, etc...

Do you have any ideas? Thank you!

I tried this, but it does not work :

class GenericCollection extends ResourceCollection
{
    protected static $resourceMap = [
        Category::class => \App\Http\Resources\CategoryResource::class,
        User::class => \App\Http\Resources\UserResource::class,
    ];

    public function toArray($request)
    {
        return [
            'data' => $this->collection->transform(function ($model) {
                return self::getResourceClass($model);
            }),
            'foo' => 'bar',
        ];
    }

    protected static function getResourceClass($model)
    {
        foreach (self::$resourceMap as $modelClass => $resourceClass) {
            if ($model instanceof $modelClass) {
                return $resourceClass;
            }
        }

        throw new Exception('Resource class not found', 500);
    }
}
0 likes
1 reply

Please or to participate in this conversation.