如何在Symfony 4中为Pagerfanta分页器添加查询参数?
在Symfony 4中给Pagerfanta分页链接添加搜索查询参数
我之前刚好处理过完全一样的需求,结合Symfony 4和Pagerfanta实现带搜索参数的分页其实很简单,给你分享两种实用的方法:
方法一:Twig模板中直接传递查询参数(最常用)
Pagerfanta的Twig扩展默认只生成带page参数的分页链接,要带上搜索参数的话,只需要在渲染分页时添加route_params选项,把当前请求的查询参数传进去就行。
传递所有查询参数
如果想把当前URL里的所有查询参数都带到分页链接中(比如同时有搜索关键词、筛选条件等),可以用app.request.query.all()获取全部参数:
{{ pagerfanta(pager, 'twitter_bootstrap4', { 'route_params': app.request.query.all() }) }}
这样原来的URL如果是/articles?search=symfony,分页后就会自动变成/articles?search=symfony&page=2,完全符合你的需求。
传递指定查询参数
如果只想传递特定的搜索参数(避免带上无关参数),可以手动指定参数键值:
{{ pagerfanta(pager, 'twitter_bootstrap4', { 'route_params': { 'search': app.request.query.get('search') } }) }}
方法二:控制器中自定义路由生成器(复杂场景)
如果你的业务逻辑比较复杂,需要在控制器层面控制分页参数,可以实现Pagerfanta的RouteGeneratorInterface来生成带参数的路由:
use Pagerfanta\RouteGenerator\RouteGeneratorInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; // 从请求中获取搜索参数 $searchQuery = $request->query->get('search'); // 创建自定义路由生成器 $routeGenerator = new class($searchQuery, $this->urlGenerator) implements RouteGeneratorInterface { private $searchQuery; private $urlGenerator; public function __construct(?string $searchQuery, UrlGeneratorInterface $urlGenerator) { $this->searchQuery = $searchQuery; $this->urlGenerator = $urlGenerator; } public function generate(int $page): string { $params = ['page' => $page]; // 如果存在搜索参数,添加到路由参数中 if ($this->searchQuery) { $params['search'] = $this->searchQuery; } return $this->urlGenerator->generate('your_route_name', $params); } }; // 后续将这个路由生成器传递给Pagerfanta的视图渲染组件即可
额外注意事项
如果你的搜索表单是用POST方法提交的,建议改成GET方法——因为分页链接是GET请求,POST的参数不会自动附加到URL上,改成GET后搜索参数会直接出现在URL中,更适合分页场景。示例表单:
<form method="get" action="{{ path('your_route_name') }}"> <input type="text" name="search" value="{{ app.request.query.get('search') }}" placeholder="输入关键词搜索"> <button type="submit">搜索</button> </form>
内容的提问来源于stack exchange,提问作者kevin
相关产品推荐
相关产品推荐

