在PHP框架中,为什么要使用“路由”概念?


31

我问这个的原因是因为PHP脚本不是路由吗?例如,如果您有article.php,那么您的路线就是http://mysite.com/article.php

当路由已经作为简单文件存在时,为什么还要进一步抽象它的概念呢?

Answers:


44

要了解路由器的功能,您必须首先了解什么是重写引擎。从维基百科文章(重点是我的):

重写引擎是用于修改Web URL外观(URL重写)的软件。重写的URL(有时称为短URL,奇特URL或SEF),用于提供指向网页的更短,更相关的链接。该技术在用于生成网页的文件和显示给World的URL之间增加了一定程度的分隔

使用重写引擎时,URL和PHP脚本之间没有1:1的关联。同一篇文章中的一个示例:

http://example.com/wiki/index.php?title=Page_title

可以重写为:

http://example.com/wiki/Page_title

使用该技术有多种好处。由于PHP通常与Apache紧密结合,因此最常用的重写引擎是Apache的mod_rewrite

如果要重写URL,则需要某种路由,因为路由是获取URL,将其分解为组件并确定要调用的实际脚本的过程。Zend Framework 的标准路由器文档页面将过程解释为:

路由是获取URI端点(位于基本URL之后的URI部分)并将其分解为参数以确定应该接收请求的模块,控制器和该控制器的操作的过程。

大多数PHP框架现在是基于MVC模式,并在一个MVC框架的过程是这样的*

  1. 浏览器指向一个URL,
  2. Web服务器捕获请求并将其转发到公共入口点,通常是index.php脚本,
  3. index.php 获取URL并开始路由过程。
  4. URL被分解为参数,其中第一个是控制器,第二个是操作方法,其余被视为动态参数,
  5. 如果存在与第一个参数匹配的控制器类,则实例化控制器对象,
  6. 通常调用控制器对象功能的动作方法,其返回值是实际返回浏览器的值。

与控制器和方法匹配的参数通常使用通过正则表达式进行匹配,以能够处理复杂的动态路由模式(称为路由)。可以在CodeIgniter的URI路由文档页面上找到路由的良好示例:

$ route ['journals'] =“博客”;

$ route ['blog / joe'] =“博客/用户/ 34”;

$ route ['product /(:any)'] =“目录/ product_lookup”;

$ route ['product /(:num)'] =“目录/ product_lookup_by_id / $ 1”;

所述$route阵列保持图案作为键和最终的动作,如值controller/action_method/dynamic_parameter的格式。

*这并不是为了描述规范的过程,而只是为了简化说明。


15
应该有一个用于描述mvc路由器的徽章,而不使用“ dispatch”的任何派生……
yannis,2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.