如何在CodeIgniter 3中实现包含两个控制器的URL结构?
在CodeIgniter 3中实现嵌套控制器风格的URL
问题描述
我想要实现包含两个控制器的URL,例如domain.com/category/js/topic/promise。其中category和topic是控制器,js是category控制器的参数,promise是topic控制器的参数。我未找到相关示例,请问在CodeIgniter 3中如何实现这类包含两个控制器的URL?
以下是我的控制器代码:
Category控制器
/* code of category controller*/ class Category extends MY_Controller{ public function index($category = null){ if($category == null){ // here show all categories using model } else{ // show topics of given category } } }
Topic控制器
/* code of topic controller */ class Topic extends MY_Controller{ public function index($topic = null){ if($topic == null){ // here show all topics using model of the selected category } else{ // show data of selected topic } } }
实现方案
CodeIgniter 3的默认路由规则是控制器/方法/参数,无法直接支持这种嵌套两个控制器的URL结构,需要通过自定义路由来实现,同时调整控制器方法的参数接收逻辑。
1. 配置自定义路由
打开application/config/routes.php,添加以下路由规则:
// 匹配 category/[分类参数]/topic/[话题参数] 的URL,映射到Topic控制器的index方法 $route['category/(:any)/topic/(:any)'] = 'topic/index/$2/$1'; // 保留Category控制器的原有路由规则,确保基础访问正常 $route['category/(:any)'] = 'category/index/$1'; $route['category'] = 'category/index';
这条自定义路由会将domain.com/category/js/topic/promise解析为:调用Topic控制器的index方法,把promise作为第一个参数(话题参数),js作为第二个参数(分类参数)传递过去。
2. 修改Topic控制器的参数接收逻辑
因为现在需要同时获取分类和话题两个参数,调整Topic控制器的index方法:
class Topic extends MY_Controller{ // 新增$category参数,默认值为null public function index($topic = null, $category = null){ if($category == null){ // 处理无分类的场景(如果业务需要) } elseif($topic == null){ // 显示指定分类下的所有话题,使用$category参数查询数据 } else{ // 显示指定分类下的指定话题数据,使用$category和$topic参数查询 } } }
3. 验证路由有效性
配置完成后,验证以下场景是否正常工作:
- 访问
domain.com/category:触发Category控制器的index方法,显示所有分类 - 访问
domain.com/category/js:触发Category控制器的index方法,显示js分类下的所有话题 - 访问
domain.com/category/js/topic/promise:触发Topic控制器的index方法,显示js分类下的promise话题详情
内容的提问来源于stack exchange,提问作者MdFarzan
相关产品推荐
相关产品推荐

