Codeigniter变长参数列表

4
我正在使用Codeigniter制作教程系统,但是在使用子类别方面遇到了一些困难。
URL结构如下:/tutorials/test/123/this-is-a-tutorial
其中: - tutorials是控制器 - test是类别的简码 - 123是教程ID(在SQL查询中使用) - this-is-a-tutorial只是为了使URL更美观的一个slug
我通过将类别作为第一个参数,将ID作为第二个参数传递给我的控制器函数。
public function tutorial($category = NULL, $tutorial_id = NULL);

现在,如果我想要子类别(无限深度),比如:/tutorials/test/test2/123/another-tutorial。我该如何实现?
谢谢!
3个回答

6
阅读无限参数,你至少有两个有用的工具: 因此,在您的控制器中:
  • 弹出最后一段/参数(这是您的 slug,不需要)
  • 假设最后一个参数是教程 ID
  • 假设其余部分为类别
代码示例:
public function tutorial()
{
    $args = func_get_args();
    // ...or use $this->uri->segment_array()

    $slug = array_pop($args);
    $tutorial_id = array_pop($args); // Might want to make sure this is a digit

    // $args are your categories in order
    // Your code here
}

其余代码和验证取决于您要使用参数做什么具体操作。

2
在 PHP 5.6+ 中,您可以使用 ... 标记。例如:function sum(...$numbers) { foreach($numbers as $n) php.net/manual/en/functions.arguments.php - Dean Or

0
如果您需要变量类别,可以使用URI类: $this->uri->uri_to_assoc(n)

分类是动态的,也从数据库中提取。 - EsTeGe

0

你可能想考虑的另一个选项是CodeIgniter的控制器函数重映射功能,你可以使用它来覆盖默认行为。你将能够在控制器内定义一个单一的函数来处理所有对该控制器的调用,并将剩余的URI参数作为数组传递。然后你可以随心所欲地处理它们。

请参见这里了解相关文档。


那看起来也很有趣。我可能会在另外一件事情上使用它。 - EsTeGe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接