0

我正在使用 PHP 和ToroPHP进行路由。

未知数量的子页面

它工作得很好,但在我的情况下,我可以添加带有孩子和父母的页面,其中父母可以有未知数量的有子页面。

在 ToroPHP 中,它可能如下所示:

// My Path: http://www.test.com/product/house/room/table/leg/color/

Toro::serve(array(
    "/" => "Home",
    "/:string/:string/:string/:string/:string/:string/" => "Page"
));

class Page {
    function get($slug, $slug2, $slug3, $slug4, $slug5, $slug6) {
        echo "First slug: $slug";
    }
}

问题

  1. 我可以弄清楚最大深度可以是多少,然后循环并附加一个包含“/:string”参数的字符串,但它看起来不太好。

  2. Page-class 中的 get 函数采用未知数量的 in 参数。我可以从函数外部计算最大深度,但我需要函数知道要取多少值。

问题

  1. 有没有其他方法解决问题1?也许是一些正则表达式?
  2. 如何使函数采用未知数量的 in 参数?
  3. 也许我试图以错误的方式解决这个问题,前两个问题不相关?如果是这样,请纠正我。
4

2 回答 2

2

为了让您的操作接收所有参数,您需要在您的正则表达式中捕获它们。您可以使用括号捕获正则表达式中的值。:string只是([a-zA-Z]+). 您可以在第一段之后应用通配符,如下所示:

"/product/(.*?)" => "Page"

但是,这意味着您需要在您的操作中自己解析 URL,这也不是很干净。

如果你想让这个特殊情况更干净,一个选项是使用str_repeat

Toro::serve(array(
    "/" => "Home",
    "/" . str_repeat(":string/", 6) => "Page"
));

ToroPHP 是一个非常简单的库,它不应该那么难分叉并随心所欲地弯曲它。理想情况下,您希望如何定义这样的路线?也许像这样的路线/:string*6


您始终可以将比定义的参数更多或更少的参数传递给 PHP 函数。使用func_get_args获取所有传递的参数,使用func_num_args获取传递的参数个数。

于 2012-12-11T15:54:25.210 回答
0

在回答问题 2 时,您是否可以将 GET 参数格式化为数组,然后传入数组而不是单个值?

也许像:

$allSlugs = array($slug, $slug2, $slug3, $slug4, $slug5, $slug6);

// Pass $allSlugs into your instance of Page::get($allSlugs);

class Page {
    function get($getValues) {
        echo isset($getValues[0]) ? "First slug: ".$getValues[0] : '';
    }
}
于 2012-12-07T08:42:34.540 回答