ONE FLOW, END TO END.
From your query to pagination links.
Give PaginatorInterface an unpaginated source. It resolves the current
request, fetches one slice, and returns an iterable result ready for Twig.
public function __invoke(
ProductRepository $repository,
PaginatorInterface $paginator,
): Response {
$products = $paginator->paginate(
$repository->createListQuery(),
);
return $this->render('product/index.html.twig', [
'products' => $products,
]);
}
{% for product in products %}
<article>
<h3>{{ product.name }}</h3>
<p>{{ product.category }}</p>
<strong>{{ product.price }}</strong>
</article>
{% endfor %}
{{ ux_pagination(products) }}