Dynamic (but limited) Page Size with Laravel Pagination

Let users decide, but don’t let users abuse.

Laravel makes pagination an extremely simple process, you simply call paginate() on Eloquent and be done with it. Today I received a feature request where I had to allow the front-end team to decide the size of the page. It’s also a simple task, you just give it as a parameter paginate($size); . Something like this:

Sometimes this is all you need because your business model can tell you if that entity might grow indefinitely. For this case, we charge per user and it’s very unlikely that a company will be buying 1 million users. However, I know that in the next few weeks I’ll be working on some other APIs that do have millions of records, which means I cannot allow a page size bigger than a reasonable amount.

Great. Now I can make sure that the API I’m exposing on the internet will not degrade our services if someone set page_size to 1 billion. But it still doesn’t feel awesome because I have to remember to set this up every time I’m writing a paginatable endpoint.

Paginatable Trait

Behind the scenes, Laravel defaults to getPerPage on the Eloquent Model in case a specific page size is not provided. By default, Laravel ships with 15 per page. With a paginatable trait, we can override that method and implement it on models that should allow the Requester to tell us how many items per page they want while validating if they’re not requesting too much.