JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

PHP路由原理剖析,用最少的代码实现一个简易路由

wys521 2024-10-25 18:20:51 精选教程 30 ℃ 0 评论

路由的作用的是什么?其实路由就相当于一个指路人。它统一了网站的入口,只访问index.php文件。并让不同的url都可以找到它们的目的地 (也就是执行相应的控制器方法或者闭包)。平时用的倒是不少,但它是怎么实现的了? 接下来我将实现一个功能比较简单的路由类

第一步,定义一个路由类,并且实现__callStatic,这是一个魔术方法,如果你不清楚这个函数的作用,请到php的官方网站查看手册,这里就不讲了。图中可以看到我定义了3个数组,分别保存路由定义时的路由规则,请求方法和回调函数。__callStatic只是简单的将对应的项压进对应的数组

php代码

第二步,定义一个dispatch 静态方法,函数名可以随便起,parse_url的用法参考 php 官方手册。基本思路是,1.获取访问的url 的pathinfo部分。2.获取访问方法。3.判断路由是否有定义。4.如果有定义就执行闭包否则输出404。

php代码

第三步,接下来就可以用了,定义一个config目录,在目录下定义一个routes.php文件。参考下图,引入上面完成的路由类,定义路由和闭包,调用dispatch方法

routes.php

入口文件只需引入上面定义的routes.php文件即可

index.php

整个项目的目录结构就是这样

目录结构

在浏览器访问效果,成功调用了刚才定义的方法

浏览器

404

为了让服务器知道我们访问的不是真实路径下的文件,需要开启伪静态,看下面

.htaccess(Apache)

RewriteEngine On
RewriteBase /
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [QSA,L]

.htaccess(Nginx)

rewrite ^/(.*)/$ /$1 redirect;
if (!-e $request_filename){
rewrite ^(.*)$ /index.php break;
}

就这样一个简单路由就完成了,尽管还有很多可以完善的地方,比如调用控制器的方法和参数传入。只能下次分享了

php7

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表