ToroPHP路由 - 使用子节点重写URL

时间:2012-12-07 08:35:34

标签: php class function routing

我正在使用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. 我可以弄清楚最大深度是多少,然后循环和追加 out包含“/:string”参数的字符串,但它看起来不像 那很好。

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

  3. 问题

    1. 问题1有替代方法吗?一些正则表达式可能吗?
    2. 如何使函数获取未知数量的in参数?
    3. 也许我尝试以错误的方式解决这个问题,前两个问题是不相关的?如果那样,请纠正我。

2 个答案:

答案 0 :(得分: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获取传递的参数数量。

答案 1 :(得分: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] : '';
    }
}