2

我正在使用 codeigniter 构建一个教程系统,并希望实现以下 URL 结构:

  • /tutorials --> 一个包含所有类别列表的介绍页面
  • /tutorials/{a category as string} --> 这将给出给定类别的教程列表,例如 /tutorials/php
  • /tutorials/{a category as string}/{an ID}/{tutorial slug} --> 这将显示教程,例如 /tutorials/php/123/how-to-use-functions
  • /tutorials/add --> 添加新教程的页面

问题是当我想使用前两种类型的 URL 时,我需要将参数传递给控制器​​的 index 函数。第一个参数是可选的类别,第二个是可选的教程ID。在发布之前我做了一些研究,所以我发现我可以添加一个类似的路由tutorials/(:any),但问题是当使用最后一个 URL (/tutorials/add) 时,这个路由也会add作为参数传递。

有什么想法可以实现吗?

4

3 回答 3

13

您的路由规则可能按以下顺序排列:

$route['tutorials/add'] = "tutorials/add"; //assuming you have an add() method
$route['tutorials/(:any)'] = "tutorials/index"; //this will comply with anything which is not tutorials/add

然后在控制器的 index() 方法中,您应该能够确定传递的是类别 ID 还是教程 ID!

于 2012-06-17T21:45:48.343 回答
10

如果您想向控制器添加更多方法,而不仅仅是“添加”,我确实认为重新映射必须对您的问题更有用。这应该完成任务:

function _remap($method)
{
  if (method_exists($this, $method))
  {
    $this->$method();
  }
  else {
    $this->index($method);
  }
}
于 2012-12-21T10:01:02.850 回答
3

发布几分钟后,我想我已经找到了一个可能的解决方案。(我感到羞耻)。

在伪代码中:

public function index($cat = FALSE, $id = FALSE)
{
    if($cat !== FALSE) {
        if($cat === 'add') {
            $this->add();
        } else {
            if($id !== FALSE) {
                // Fetch the tutorial
            } else {
                // Fetch the tutorials for category $cat
            }
        }
    } else {
        // Show the overview
    }
}

欢迎对此解决方案提供反馈!

于 2012-06-17T21:42:45.443 回答