搜索
首页后端开发php教程PHP路由实现原理,求指教

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

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

回复内容:

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

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

阅读别人的代码除了硬读, 更好的方式是开调试器(如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...

给你推荐一个路由实现

https://github.com/bephp/router

  1. 代码很短,100行左右

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

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

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

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

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

当然,还有更简单直接的

<code>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('/');
</code>

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

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

<code><?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)
    }
}</code>

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

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

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

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

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

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
PHP如何识别用户的会话?PHP如何识别用户的会话?May 01, 2025 am 12:23 AM

phpientifiesauser'ssessionusessessionSessionCookiesAndSessionIds.1)whiwSession_start()被称为,phpgeneratesainiquesesesessionIdStoredInacookInAcookInamedInAcienamedphpsessidontheuser'sbrowser'sbrowser.2)thisIdAllowSphptptpptpptpptpptortoreTessessionDataAfromtheserverMtheserver。

确保PHP会议的一些最佳实践是什么?确保PHP会议的一些最佳实践是什么?May 01, 2025 am 12:22 AM

PHP会话的安全可以通过以下措施实现:1.使用session_regenerate_id()在用户登录或重要操作时重新生成会话ID。2.通过HTTPS协议加密传输会话ID。3.使用session_save_path()指定安全目录存储会话数据,并正确设置权限。

PHP会话文件默认存储在哪里?PHP会话文件默认存储在哪里?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

您如何从PHP会话中检索数据?您如何从PHP会话中检索数据?May 01, 2025 am 12:11 AM

ToretrievedatafromaPHPsession,startthesessionwithsession_start()andaccessvariablesinthe$_SESSIONarray.Forexample:1)Startthesession:session_start().2)Retrievedata:$username=$_SESSION['username'];echo"Welcome,".$username;.Sessionsareserver-si

您如何使用会议来实施购物车?您如何使用会议来实施购物车?May 01, 2025 am 12:10 AM

利用会话构建高效购物车系统的步骤包括:1)理解会话的定义与作用,会话是服务器端的存储机制,用于跨请求维护用户状态;2)实现基本的会话管理,如添加商品到购物车;3)扩展到高级用法,支持商品数量管理和删除;4)优化性能和安全性,通过持久化会话数据和使用安全的会话标识符。

您如何在PHP中创建和使用接口?您如何在PHP中创建和使用接口?Apr 30, 2025 pm 03:40 PM

本文解释了如何创建,实施和使用PHP中的接口,重点关注其对代码组织和可维护性的好处。

crypt()和password_hash()有什么区别?crypt()和password_hash()有什么区别?Apr 30, 2025 pm 03:39 PM

本文讨论了PHP中的crypt()和password_hash()之间的差异,以进行密码哈希,重点介绍其实施,安全性和对现代Web应用程序的适用性。

如何防止PHP中的跨站点脚本(XSS)?如何防止PHP中的跨站点脚本(XSS)?Apr 30, 2025 pm 03:38 PM

文章讨论了通过输入验证,输出编码以及使用OWASP ESAPI和HTML净化器之类的工具来防止PHP中的跨站点脚本(XSS)。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。