search

Home  >  Q&A  >  body text

PHP路由实现原理,求指教

用了一段时间框架才恍然大悟,貌似MVC框架的核心在于路由,请各位大侠指教下具体原理,例如TP5的路由就很强大,但源码基本没注释看了2小时,楞是没整明白整个流程是怎么样的。

我现在能做到的只有pathinfo这一步,后面的各种规则路由、正则路由就看不懂了,希望你能给我一个实现流程,或者具体demo、在或则教程,能有相关书籍也可以O(∩_∩)O谢谢!


高洛峰高洛峰2921 days ago1020

reply all(2)I'll reply

  • 三叔

    三叔2016-11-15 16:26:59

    MVC的核心思想是分离界面和逻辑,个人认为跟前端路由没什么关系,前端路由只不过是为了统一入口.

    不要把问题想得太复杂,其实就是提取出字符串,然后套数组,其实就是一行代码的事.

     '',
      1 => 'post', //控制器(控制器存在就require)
      2 => 'edit', //方法
      3 => '1024', //参数(获取参数foo就用传统的$_GET['foo'])
    )
    
    $class = $uri[1];
    require 'controller/'.$class.'.php'; // controller/post.php
    $object = new $class();
    $action = $uri[2];
    $parameter = $uri[3];
    echo call_user_func_array(array($object, $action), array($parameter)); //调用对象里的方法并传参
    
    controller/post.php:
    class post {
        public function edit($id) {
            return '$'.__CLASS__.'->'.__FUNCTION__.'('.$id.')'; //输出 $post->edit(1024)
        }
    }


    reply
    0
  • 欧阳克

    欧阳克2016-11-15 16:26:36

    给你推荐一个路由实现

    https://github.com/bephp/router

    代码很短,100行左右

    支持get,post等方式定义路由,只要是callable的都能行。

    除了匹配pathinfo里面的参数意以外,还会通过反射自动获取参数.(这个特性比较有用)

    使用树形结构存储路由映射表,比常用的几个路由性能要好(有beachmark)

    支持“编译”,相当于缓存路由表,获取更快性能

    可以使用composer安装,零依赖

    当然,还有更简单直接的

    class R{function($r,$c){$this->r[$r]=$c;} function($r){$this->r[$r]();}}
    $r=new R;
    $r->a('/', function(){echo 'hello world';});
    $r->e('/');


    reply
    0
  • Cancelreply