PHP路由实现原理,求指教

 我没资格我不配 发布于 2022-11-29 05:46

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

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

7 个回答
  • 阅读别人的代码除了硬读,更好的方式是开调试器(如xdebug)走单步调试,一方面你有来自于调试器的信息,另一方面有你自己的实际的可以跑起来的用例(你写的测试用的代码),能够更加方便你理解

    回到路由这个话题,说到底你其实只要想明白怎么拆分解析pathinfo就可以了,直接根据pathinfo映射到namespace还是通过正则表达式映射到某个controller都只是其中的一个解析方式罢了

    如果如果要试着造轮子的话,你可以试着实现一个最简单的直接映射到namespace下面的class的方法的

    hello/world->HelloController->world()

    test/hello/world->test\HelloController->world()

    路由解析出来之后是分发,这块可以去了解反射,Closure等等相关的知识

    最后,github上有很多只实现router的组件可以找到,比起整体框架,你也可以选择只读那些组件的代码(实际使用可以通过composer引入你的项目)

    例如:

    • https://github.com/nikic/Fast...

    • https://github.com/dannyvanko...

    • https://github.com/mrjgreen/p...

    2022-11-29 05:54 回答
  • 给你推荐一个路由实现

    https://github.com/bephp/router

    1. 代码很短,100行左右

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

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

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

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

    6. 可以使用composer安装,零依赖

    当然,还有更简单直接的

    classR{function($r,$c){$this->r[$r]=$c;}function($r){$this->r[$r]();}}$r=newR;$r->a('/',function(){echo'helloworld';});$r->e('/');
    2022-11-29 05:54 回答
  • MVC的核心思想是分离界面和逻辑,个人认为跟前端路由没什么关系,前端路由只不过是为了统一入口.

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

    <?php$_SERVER['REQUEST_URI']='/post/edit/1024?foo=bar';$uri=explode('/',parse_url($_SERVER['REQUEST_URI'],PHP_URL_PATH));var_export($uri);//输出array(0=>'',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];echocall_user_func_array(array($object,$action),array($parameter));//调用对象里的方法并传参controller/post.php:classpost{publicfunctionedit($id){return'$'.__CLASS__.'->'.__FUNCTION__.'('.$id.')';//输出$post->edit(1024)}}
    2022-11-29 05:54 回答
  • 这个最近自己在写了一个小框架路由的实现我里面写的比较简单,我觉得看看还是可以的。
    地址:https://github.com/zhoujiangy...
    core文件夹下面的route就是路由实现类

    2022-11-29 05:54 回答
  • 基本思路是浏览器端通过URL字符串提供控制器类的名字和方法的名字,PHP据此找到对应的类和方法。

    具体demo代码可猛戳这里,http://www.jianshu.com/p/d4ce...

    2022-11-29 05:54 回答
  • 可以尝试看看ci的路由,多种匹配模式,是利用了迭代器模式,迭代自定义的路由,迭代出能符合SERVER['REQUEST_URI']中匹配的值,即取出控制器和方法,在使用new类->方法或者call_user_func()的方式调用对应的方法;

    2022-11-29 05:54 回答
  • 花钱去看云买教程吧,官方出了路由详细说明

    2022-11-29 05:54 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有