javascript - 什么是路由?路由有什么用?
伊谢尔伦
伊谢尔伦 2017-04-11 09:55:26
[JavaScript讨论组]

什么是路由?路由有什么用?
为什么改变不同url可以访问到不同的页面?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(4)
ringa_lee

PHP 路由

在远古时代(PHP 4 面向过程),人们这么用URL的

一个文件代表一个执行对象,根据名字可以看出来是干嘛的

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

后来人们觉得麻烦(PHP 4~5过渡阶段),开始这么做,在一个文件里面写

通过分支来判断执行对象(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

接着Apache支持了Rewrite技术

因为大家觉得网址太长了,以及当年的SEO喜欢抓取静态页面等原因

所以使用了rewrite做了伪静态(比如Discuz至今还在使用)

http://www.xx.com/news/1.html

==使用rewrite指向到==>

http://www.xx.com/news.php?id=1

接着PHP支持了面向对象(OO),且apache支持PATHINFO,路由时代到来

rewrite的确解决了很多人的麻烦,但是最大的的一个缺点:
一个网址就要设置一条rewrite规则,所以聪明的开发者结合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/***

框架读取PHPINFO,比如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做参数

RESTful 时代

人类还是觉得这网址胡乱来的方式太糟糕了,并且在互联网上,一般就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'); 使用上面的方式对应

这便是路由到目前的历史(2016)

以为这就完了,Laravel知道你很懒,它有3中路由方式可以调用,下面是其中最懒的一种。

Route::controller('news', 'NewsController');
可以自动将任意的news/do指向到NewsController下的function getDo

你以为这就完了,我给Laravel加上了无态路由,将之前的自动代理的路由加到了Laravel中,可以让你路由的懒的写

无路由设置代码
自动将 user/xxx 指向到UserController下的function xxx

你以为结束了?

  • laravel 还支持将路由绑定到指定的域名(泛域名也可以)

  • laravel 还支持对某一类路由,控制登录、控制权限(中间件)

  • laravel 是啥,提那么多次干嘛?2016年不会laravel,是不是落伍了?

PHP路由实现方式

这是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();

Javascript路由

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,成为了最重要的组成部分

怪我咯

路由可以理解成根据请求的不同URL,映射到不同处理程序上。反过来,需要对每个不同的页面定义不同的路由来实现区分界面。

PHP中文网

路由的作用就是根据路由协议转发数据的.
一般框架的路由系统都设计成路由器+路由协议. (Router + Route)
路由系统的作用就是把request url根据路由协议转发到控制器上.

url的全称叫统一资源定位符, 所以不同的url代表是访问不同的资源.
所以在定义路由的转发规则时, 一般情况下不同的url会转发到不同的控制器上, 也就获取到不同的资源.
就算是相同的资源, 不同的访问方式, 对这个资源的操作方式也不尽相同. 比如restful架构.

PHPz

简单来说,路由就是给指定的页面分配一个url地址。
通过这个url地址,你就能访问到该页面了。

比如你写了一个页面,/static/public/game/index.html,
你的服务器项目域名http:www.dsxxx.com
你通过一些方式,给该页面配置了一个路由地址/game
那么,你就可以通过http:www.dsxxx.com/game访问到上面这个index.html文件了

改变不同的url访问到不同的页面,都是通过一些方式做了配置的,具体的方式你可以随着学习的深入逐步了解到

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号