• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

PHP路由实现原理,求指教

PHP admin 1年前 (2018-06-08) 7次浏览 未收录 0个评论
文章目录[隐藏]

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

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

回复内容:

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

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

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

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

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

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

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

例如:

给你推荐一个路由实现

https://github.com/bephp/router

当然,还有更简单直接的

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

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

 '',
  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)
    }
}

这个 最近自己在写了一个小框架 路由的实现我里面写的比较简单,我觉得看看还是可以的。
地址:https://github.com/zhoujiangy…
core文件夹下面的route就是路由实现类

基本思路是浏览器端通过URL字符串提供控制器类的名字和方法的名字,PHP据此找到对应的类和方法。

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

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

花钱去看云买教程吧,官方出了路由详细说明


39MO , 版权所有丨如未注明 , 均为原创丨转载请注明原文链接:PHP路由实现原理,求指教
喜欢 (0)
[1353713598@qq.com]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址