扫码关注官方订阅号
什么是路由?路由有什么用?为什么改变不同url可以访问到不同的页面?
小伙看你根骨奇佳,潜力无限,来学PHP伐。
一个文件代表一个执行对象,根据名字可以看出来是干嘛的
http://www.xx.com/news/create.php http://www.xx.com/news/edit.php?id=123 http://www.xx.com/comment/edit.php?id=456
通过分支来判断执行对象(discuz 7 这么做的)
switch($_GET['action']) { case 'create': ... break; case 'edit' $id = $_GET['id']; ... }
http://www.xx.com/news.php?action=create http://www.xx.com/news.php?action=edit&id=123 http://www.xx.com/comment.php?action=edit&id=456
因为大家觉得网址太长了,以及当年的SEO喜欢抓取静态页面等原因
所以使用了rewrite做了伪静态(比如Discuz至今还在使用)
http://www.xx.com/news/1.html ==使用rewrite指向到==> http://www.xx.com/news.php?id=1
PATHINFO
rewrite的确解决了很多人的麻烦,但是最大的的一个缺点:一个网址就要设置一条rewrite规则,所以聪明的开发者结合PHPINFO技术创造了路由
PHPINFO
什么是pathinfo,是指http://www.xx.com/index.php/news/create在php文件后面可以继续写一个字符串/news/create,/开头,可以是任意东西然后Apache通过htaccess等技术手段重写 http://www.xx.com/*** 到 http://www.xx.com/index.php/***
pathinfo
http://www.xx.com/index.php/news/create
/news/create
/
http://www.xx.com/***
http://www.xx.com/index.php/***
框架读取PHPINFO,比如CI(Kohana)的路由是自动代理(无法自定义路由名),看如下代码
CI(Kohana)
http://www.xx.com/news/create ==指向到==> class News { public function create() { echo 'something'; } }
自动代理的路由方式满足不了开发者,Laravel横空出世,可以将路由指向到任意地方
比如这就是将news/kill的GET请求,全部指向到NewsController.php下的kickme函数
http://www.xx.com/news/kill ===> 路由名 路由指向类 Route::get('news/kill', 'NewsController@kickme'); Route::get('news/delete/{id}', 'NewsController@delete'); //id 会传到delete做参数
人类还是觉得这网址胡乱来的方式太糟糕了,并且在互联网上,一般就CRUD(增删查改)这四种方法,因此,提出了规范查看手册 https://www.load-page.com/man...segmentfault就是这种方式
请求方法 路径 对应函数 路由名字 解释 GET /user index() user.index 首页 GET /user/{id} show($id) user.show ID对应的用户资料 GET /user/create create() user.create 新建用户页面 POST /user store() user.store 保存新建的资料 GET /user/{id}/edit edit($id) user.edit 编辑用户资料 PUT/PATCH /user/{id} update($id) user.update 保存编辑的资料 DELETE /user/{id} destory($id) user.destory 删除用户
伴随着RESTful的标准出台,Laravel继续跟进,提出了无比省事的资源路由
Route::resource('user', 'UserController'); 使用上面的方式对应
以为这就完了,Laravel知道你很懒,它有3中路由方式可以调用,下面是其中最懒的一种。
Route::controller('news', 'NewsController'); 可以自动将任意的news/do指向到NewsController下的function getDo
Route::controller('news', 'NewsController');
news/do
NewsController
function getDo
你以为这就完了,我给Laravel加上了无态路由,将之前的自动代理的路由加到了Laravel中,可以让你路由的懒的写
无路由设置代码自动将 user/xxx 指向到UserController下的function xxx
无路由设置代码
UserController
function xxx
你以为结束了?
laravel 还支持将路由绑定到指定的域名(泛域名也可以) laravel 还支持对某一类路由,控制登录、控制权限(中间件) laravel 是啥,提那么多次干嘛?2016年不会laravel,是不是落伍了?
laravel 还支持将路由绑定到指定的域名(泛域名也可以)
laravel 还支持对某一类路由,控制登录、控制权限(中间件)
laravel 是啥,提那么多次干嘛?2016年不会laravel,是不是落伍了?
这是PHP的自动代理路由实现方法,伪代码如下(具体实现要比这复杂的多)
http://www.xx.com/index.php/news/create $pathinfo = $_SERVER['PATH_INFO']; list($ctrl, $action) = explode('/', ltrim($pathinfo, '/')); $class = 'App\Http\Controllers\'. ucfirst($ctrl). 'Controller'; if (class_exists($class) && method_exists($class, $action)) return (new $class)->$action();
js使用的方式类似于PHP,但是利用的location.hash伪代码如下(具体实现要比这复杂的多):
// http://www.xx.com/index.html#/news/create var pathinfo = location.hash; //var paths = pathinfo.split('/'); ajax({ url: pathinfo + '.html' success: function(html){ $('body').html(html); } })
一个好的路由,
自定义任何的路由名,指向到任意的Controller
支持RESTful的路由,遵循国际规范
我很懒,不想写(或者写很少)的路由,然后自动指向对应的方法所以,如今的PHP框架中,路由逐渐替代了rewrite,成为了最重要的组成部分
rewrite
路由可以理解成根据请求的不同URL,映射到不同处理程序上。反过来,需要对每个不同的页面定义不同的路由来实现区分界面。
路由的作用就是根据路由协议转发数据的.一般框架的路由系统都设计成路由器+路由协议. (Router + Route)路由系统的作用就是把request url根据路由协议转发到控制器上.
url的全称叫统一资源定位符, 所以不同的url代表是访问不同的资源.所以在定义路由的转发规则时, 一般情况下不同的url会转发到不同的控制器上, 也就获取到不同的资源. 就算是相同的资源, 不同的访问方式, 对这个资源的操作方式也不尽相同. 比如restful架构.
简单来说,路由就是给指定的页面分配一个url地址。通过这个url地址,你就能访问到该页面了。
比如你写了一个页面,/static/public/game/index.html,你的服务器项目域名http:www.dsxxx.com你通过一些方式,给该页面配置了一个路由地址/game那么,你就可以通过http:www.dsxxx.com/game访问到上面这个index.html文件了
/static/public/game/index.html
http:www.dsxxx.com
/game
http:www.dsxxx.com/game
改变不同的url访问到不同的页面,都是通过一些方式做了配置的,具体的方式你可以随着学习的深入逐步了解到
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
PHP 路由
在远古时代(PHP 4 面向过程),人们这么用URL的
一个文件代表一个执行对象,根据名字可以看出来是干嘛的
后来人们觉得麻烦(PHP 4~5过渡阶段),开始这么做,在一个文件里面写
通过分支来判断执行对象(discuz 7 这么做的)
接着Apache支持了Rewrite技术
因为大家觉得网址太长了,以及当年的SEO喜欢抓取静态页面等原因
所以使用了rewrite做了伪静态(比如Discuz至今还在使用)
接着PHP支持了面向对象(OO),且apache支持
PATHINFO,路由时代到来rewrite的确解决了很多人的麻烦,但是最大的的一个缺点:
一个网址就要设置一条rewrite规则,所以聪明的开发者结合
PHPINFO技术创造了路由框架读取
PHPINFO,比如CI(Kohana)的路由是自动代理(无法自定义路由名),看如下代码自定义路由时代
自动代理的路由方式满足不了开发者,Laravel横空出世,可以将路由指向到任意地方
RESTful 时代
伴随着RESTful的标准出台,Laravel继续跟进,提出了无比省事的资源路由
这便是路由到目前的历史(2016)
以为这就完了,Laravel知道你很懒,它有3中路由方式可以调用,下面是其中最懒的一种。
你以为这就完了,我给Laravel加上了无态路由,将之前的自动代理的路由加到了Laravel中,可以让你路由的懒的写
你以为结束了?
PHP路由实现方式
这是PHP的自动代理路由实现方法,伪代码如下(具体实现要比这复杂的多)
Javascript路由
js使用的方式类似于PHP,但是利用的location.hash
伪代码如下(具体实现要比这复杂的多):
结语
一个好的路由,
自定义任何的路由名,指向到任意的Controller
支持RESTful的路由,遵循国际规范
我很懒,不想写(或者写很少)的路由,然后自动指向对应的方法
所以,如今的PHP框架中,路由逐渐替代了
rewrite,成为了最重要的组成部分路由可以理解成根据请求的不同URL,映射到不同处理程序上。反过来,需要对每个不同的页面定义不同的路由来实现区分界面。
路由的作用就是根据路由协议转发数据的.
一般框架的路由系统都设计成路由器+路由协议. (Router + Route)
路由系统的作用就是把request url根据路由协议转发到控制器上.
url的全称叫统一资源定位符, 所以不同的url代表是访问不同的资源.
所以在定义路由的转发规则时, 一般情况下不同的url会转发到不同的控制器上, 也就获取到不同的资源.
就算是相同的资源, 不同的访问方式, 对这个资源的操作方式也不尽相同. 比如restful架构.
简单来说,路由就是给指定的页面分配一个url地址。
通过这个url地址,你就能访问到该页面了。
比如你写了一个页面,
/static/public/game/index.html,你的服务器项目域名
http:www.dsxxx.com你通过一些方式,给该页面配置了一个路由地址
/game那么,你就可以通过
http:www.dsxxx.com/game访问到上面这个index.html文件了改变不同的url访问到不同的页面,都是通过一些方式做了配置的,具体的方式你可以随着学习的深入逐步了解到