我正在使用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";
}
}
问题
我可以弄清楚最大深度是多少,然后循环和追加 out包含“/:string”参数的字符串,但它看起来不像 那很好。
Page-class中的get-function需要一个未知数量的in 参数。我可以从函数外部计算最大深度,但我需要函数来知道要采用多少个值。
问题
答案 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] : '';
}
}