如何修改CodeIgniter 4中分页的第一页链接URL
解决CodeIgniter 4分页URL自定义问题
需求:实现如下格式的分页URL,第一页无
page/1后缀,其余分页保持page/{num}结构:http://localhost:8080/admin/all-clients http://localhost:8080/admin/all-clients/page/2 http://localhost:8080/admin/all-clients/page/3
解决方案
1. 优化控制器重定向逻辑
替换原有的segment判断代码,简化为更可靠的重定向规则:
public function index($page = 1){ // 访问page/1时自动重定向到根路径 if ($page === 1 && $this->request->getUri()->getSegment(3) === 'page') { return redirect()->to(base_url('admin/all-clients')); } $perPage = 10; $offset = ($page - 1) * $perPage; // 补全offset计算,原代码缺少*$perPage $total = $this->clientsModel->countAll(); // 查询客户端数据 $clients = $this->clientsModel ->select('clients.*, subject.subject_text') ->join('subject', 'clients.client_subject = subject.id') ->paginate($perPage, '', $page); // 直接传入$page即可,无需offset+1 // 处理分页链接 $pager = $this->clientsModel->pager; $pager->setPath('admin/all-clients', 'client-group'); $links = $pager->makeLinks($page, $perPage, $total, 'bs_custom', 4, 'client-group'); // 替换第一页链接中的page/1为空 $links = str_replace('/page/1', '', $links); echo view('admin/allClients', [ 'page_title' => 'All Clients', 'clients' => $clients, 'pager_links' => $links, ]); }
2. 确认路由配置正确性
保持现有路由顺序(CodeIgniter路由从上到下匹配,优先匹配无page的规则):
$routes->get('admin/all-clients', 'ClientsController::index'); $routes->get('admin/all-clients/page/(:num)', 'ClientsController::index/$1');
注意:如果控制器在Admin命名空间下,需补充命名空间前缀,例如\App\Controllers\Admin\ClientsController::index
3. 进阶:自定义Pager视图(可选)
若不想用字符串替换的方式,可直接修改分页视图生成逻辑:
- 复制系统视图
vendor/codeigniter4/framework/system/Views/pager/bs_custom.php到app/Views/pager/bs_custom.php - 打开自定义视图,找到链接生成代码,修改为:
// 替换原$attributes['href'] = $pager->getUrl($page); if ($page === 1) { $attributes['href'] = base_url('admin/all-clients'); } else { $attributes['href'] = $pager->getUrl($page); }
修改后无需再做字符串替换,直接生成符合要求的链接。
内容的提问来源于stack exchange,提问作者Ashis Biswas
相关产品推荐
相关产品推荐

