php路由实现原理
来源:互联网 发布:java连接ldap实例 编辑:程序博客网 时间:2024/06/05 03:11
阅读别人的代码除了硬读, 更好的方式是开调试器(如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...
- 2016年11月11日更新
- 1 评论
- 赞赏
- 编辑
给你推荐一个路由实现
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('/');
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];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) }}
- php路由实现原理
- PHP正则路由的实现原理
- 前端路由实现原理
- 前端路由的实现原理
- 原生php 实现路由功能
- PHP单文件入口URL路由原理
- PHP路由技术的原理与实践
- PHP路由技术的原理与实践
- 前端路由的两种实现原理
- 前端路由的两种实现原理
- create-react-app路由的实现原理
- PHP实现一个简单url路由功能
- 基于原生PHP的路由分配实现
- php session实现原理
- php缓存实现原理
- php session实现原理
- PHP缓存实现原理
- PHP分页实现原理
- 解析opencv中Box Filter的实现并提出进一步加速的方案(源码共享)
- 表格分页
- 朋友圈(简单实现)
- BZOJ2631:tree(LCT)
- checkbox勾选 取消勾选只能操作一次的诡异问题
- php路由实现原理
- JSTL、EL、ONGL、Struts标签的区别与使用
- bzoj 1486: [HNOI2009]最小圈
- webbrowser 截图
- 搭建MVP+Retrofit+RxJava框架详解
- 单步执行命令step into/step out/step over
- spring boot logback 配置
- [RK3288][Android6.0] 调试笔记 --- 命令行播放音乐方法
- 分区工具parted的详解及常用分区使用方法