简单的 PHP 路由

2013-11-06 12:00:41 +08:00
 icanc
http://gist.github.com/icanc/7330670
3736 次点击
所在节点    PHP
7 条回复
sun019
2013-11-06 12:29:45 +08:00
有点意思 谢谢分享
lizheming
2013-11-06 12:36:22 +08:00
擦..我还是好心的把LZ的内容给扒出来吧..好蛋疼的赶脚

https://gist.github.com/icanc/7330670
wesley
2013-11-06 14:59:56 +08:00
我也写一个
<?php
class Route{
public static $rules = [];

public static function addRule($uri,$rule,$defaults=[])
{
//$rule_param = [];
self::$rules[] = ['regex'=> self::compileRule($uri,$rule) , 'defaults'=>$defaults ];
}
public static function compileRule($uri,$rule)
{
$uri = str_replace(')', ')?', $uri);
return preg_replace_callback(
"#<([^<>/\?]+)>#i",
function ($matches) use ($rule){
$name = $matches[1];
return "(?P<{$name}>" . ( !empty($rule[$name]) ? $rule[$name] : '[^<>/]+') . ')';
},
$uri
);

}
public static function parseUri($uri){
foreach (self::$rules as $rule_setting) {
if ( preg_match("#{$rule_setting['regex']}#i", $uri, $matches) ){
$ret = $rule_setting['defaults'];
foreach ($matches as $name => $value) {
$ret[$name] = $value;
}
return $ret;
}
}
return NULL;
}
}
//example
Route::addRule(
'<controller>/<action>(/<param>)',
['controller'=>'[a-z]+','action'=>'[a-z]+'],
['controller'=>'home','action'=>'index']
);
Route::addRule(
'a_<param>.html',
['param'=>'[0-9]+'],
['controller'=>'article','action'=>'detail']
);
print_r(Route::parseUri('a_1234.html'));
print_r(Route::parseUri('find/me'));
print_r(Route::parseUri('find/somebody/tom'));
shiny
2013-11-06 15:10:02 +08:00
If you need more than 3 levels of indentation, you’re screwed anyway, and should fix your program.
skydiver
2013-11-06 15:11:29 +08:00
这代码风格看着好蛋疼……
feuvan
2013-11-06 16:07:10 +08:00
mix of java and c coding style, just like php standard lib did...
what a mess
lloydzhou
2015-10-01 05:02:58 +08:00
推荐一个精简的 Router 库做路由控制器 https://github.com/lloydzhou/router ,可以根据映射的 handler 自动从 request 获取变量,支持自定义 error handler 和 hook 。可以通过 hook 方便的定制参数过滤、登录检查等。

(new Router())
->error(405, function($message){
header('Location: /hello/world', true, 302);
})
->get('/hello/:name', function($name){
echo "Hello $name !!!";
})
->execute();

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/88235

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX