1
sun019 2013-11-06 12:29:45 +08:00
有点意思 谢谢分享
|
2
lizheming 2013-11-06 12:36:22 +08:00 1
|
3
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')); |
4
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.
|
5
skydiver 2013-11-06 15:11:29 +08:00
这代码风格看着好蛋疼……
|
6
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 |
7
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(); |