V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
icanc
V2EX  ›  PHP

简单的 PHP 路由

  •  
  •   icanc · 2013-11-06 12:00:41 +08:00 · 3912 次点击
    这是一个创建于 4070 天前的主题,其中的信息可能已经有所发展或是发生改变。
    7 条回复    2015-10-01 05:02:58 +08:00
    sun019
        1
    sun019  
       2013-11-06 12:29:45 +08:00
    有点意思 谢谢分享
    lizheming
        2
    lizheming  
       2013-11-06 12:36:22 +08:00   ❤️ 1
    擦..我还是好心的把LZ的内容给扒出来吧..好蛋疼的赶脚

    https://gist.github.com/icanc/7330670
    wesley
        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'));
    shiny
        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.
    skydiver
        5
    skydiver  
       2013-11-06 15:11:29 +08:00
    这代码风格看着好蛋疼……
    feuvan
        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
    lloydzhou
        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();
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2600 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 03:14 · PVG 11:14 · LAX 19:14 · JFK 22:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.