CodeIgniter 4分页仅显示第一页,点击其他页报404错误求助
CodeIgniter 4分页点击第二页出现404错误的解决方案
问题原因
分页点击后返回404的核心问题是路由配置与分页URL格式不匹配:
- CodeIgniter 4分页器默认生成带查询参数的URL(如
Main/customers?page=2),若你配置了$usePageUri = true,则会生成路径式URL(如Main/customers/page/2)。 - 当前
Main组路由里,$routes->get('(:segment)/(:any)', 'Main::$1/$2');仅能匹配两段路径,无法处理customers/page/2这种三段式路径URL,导致路由匹配失败,返回404。
解决方案
方案1:修改分页器配置,使用查询参数(推荐,默认方式)
打开app/Config/Pager.php,确保$usePageUri设置为false:
public $usePageUri = false;
此时分页器会生成Main/customers?page=2格式的URL,现有路由$routes->get('(:segment)', 'Main::$1');可正常匹配请求(查询参数不影响路由匹配逻辑)。
方案2:调整路由,支持路径式分页URL
若偏好路径式分页URL(如Main/customers/page/2),需在Main组路由中添加专门的匹配规则,且要放在通用路由前面(路由匹配优先从上到下):
$routes->group('/Main', ['filter'=>'authented'], static function($routes){ $routes->get('', 'Main::index'); // 优先匹配分页路径 $routes->get('(:segment)/page/(:num)', 'Main::$1', ['as' => 'page', 'page' => '$2']); // 匹配带单个数字参数的方法(如user_edit/1) $routes->get('(:segment)/(:num)', 'Main::$1/$2'); // 匹配普通方法 $routes->get('(:segment)', 'Main::$1'); $routes->match(["get", "post"], "edit-customer/(:num)", "Customer::editCustomer/$1"); });
该路由会将Main/xxx/page/2请求映射到Main::xxx方法,同时把分页参数2作为page查询参数传递,控制器代码无需修改即可正常接收。
额外优化点
- 列表视图中,无数据时的
<td colspan="4">需改为colspan="9",与表格列数对应,避免布局错乱。 - 若后续需要添加筛选条件,调用
countAllResults()前需先执行resetQuery(),防止计数不准确。
内容的提问来源于stack exchange,提问作者ieesab
相关产品推荐
相关产品推荐

