摘要:现在当我们执行路由器的方法时,它会检测在当前数组中是否匹配到路由,如果有,则执行这个函数或回调函数。
本文首发于 MVC 框架中的路由器(Router)是如何跑起来的,转载请注明出处。
说明: 貌似 SF 译文类别出 BUG,所以本文以原创类别给出。
MVC 路由器(Router)或分发器(Dispatcher)会检测 HTTP 请求的 URL,并尝试将单个 URL 组件与控制器和控制器中定义的方法匹配,同时将所有参数传入方法中。
下面给出了一个简单的路由器类,可以大致阐明路由器是如何工作的。然而在实际项目中,路由器要比下面的示例路由器复杂很多,因为它必须处理更多的东西。
routes[$route] = $closure; } // 执行特定的路由 function execute() { $path = $_SERVER["PATH_INFO"]; /** * 检测给定路由是否被定义, * 或者执行默认的 "/" 首页路由。 */ if (array_key_exists($path, $this->route)) { $this->route[$path](); } else { $this->route["/](); } } }
SimpleRouter 类是 MVC 路由器的简化模型。它的主要功能是将用户定义的每个路由添加到数组中,并执行它。要理解它是如何工作的,请将下面的代码复制到 index.php 文件中。
routes[$route] = $closure; } // 执行特定的路由 function execute() { $path = $_SERVER["PATH_INFO"]; /** * 检测给定路由是否被定义, * 或者执行默认的 "/" 首页路由。 */ if (array_key_exists($path, $this->route)) { $this->route[$path](); } else { $this->route["/](); } } } /* 创建 Router 实例 */ $router = new SimpleRouter(); /* 添加首页闭包值路由器 */ $router->add_route("/", function(){ echo "Hello World"; }); /* 添加另一个闭包路由 */ $router->add_route("/greetings", function(){ echo "Greetings, my fellow men."; }); /* 添加可回调函数作为路由 */ $router->add_route("/callback", "myFunction"); /* 回调函数处理程序 */ function myFunction(){ echo "This is a callback function named "" . __FUNCTION__ ."""; } /* 执行路由 */ $router->execute();
现在到浏览器访问下列 url:
http://localhost/index.php/ http://localhost/index.php/greetings http://localhost/index.php/callback
对于每个 url,你应该会看到在我们的路由中定义的不同消息。那么路由器是如何工作的呢?
在我们的示例中,add_route 方法将 url 的路径名(route)添加到路由数组,并且定义对应的处理操作。这个处理操作可以是一个简单的函数或者回调函数,作为闭包传入。现在当我们执行路由器的 execute 方法时,它会检测在当前 $routes 数组中是否匹配到路由,如果有,则执行这个函数或回调函数。
如果你使用 var_dump 这个 $routes 数组,你可以看到数组的具体内容。对于每个定义的路由都存储一个闭包与其关联。
array (size=3) "/" => object(Closure)[2] "/greetings" => object(Closure)[3] "/callback" => string "myFunction" (length=10)
执行处理由以下几行完成。$this->routes[$path]** 语句返回一个闭包,该闭包保存在 **$routes 数组中,用于指定路由的执行,注意语句结尾处的 ()。
$this->routes[$path](); // 或 $this->routes["/"]();
上面的示例简单地演示了路由器的工作原理,为了简单起见,我们没有处理任何错误,也没有考虑路由的安全性问题。
原文 How do MVC routers work
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/29121.html
摘要:将注意力集中保持在核心库,而将其他功能如路由和全局状态管理交给相关的库。此示例使用类似的语法,称为。执行更快,因为它在编译为代码后进行了优化。基于的模板使得将已有的应用逐步迁移到更为容易。 前言 因为没有明确的界定,这里不讨论正确与否,只表达个人对前端MV*架构模式理解看法,再比较React和Vue两种框架不同.写完之后我知道这文章好水,特别是框架对比部分都是别人说烂的,而我也是打算把...
摘要:老实说我不是第一次想歪了而且很慢总是不能很快抓住要点当别人用后端从做博客做论坛联系完成的应用的时候我跑去学单页面应用还很久挣扎在的思路当中我想说的是走大多数人走的路的确是可以减少浪费的时间和错误的走少数人在的路当然也刺激的我最近才明白原来前 老实说我不是第一次想歪了, 而且很慢, 总是不能很快抓住要点. 当别人用后端 MVC 从做博客做论坛, 联系完成 MVC 的应用的时候 我跑去学单...
摘要:只能在不同的时候选用不同的假设和不同的理论来解释问题,许来西的文章讲到科学一定程度上通过放弃一贯性换取了实用性,放弃自洽性换取了它洽性。然而遗憾的是本身只提供了模块和洋葱模型的最小封装。 在写干货之前,我想先探(qiang)讨(diao)两个问题,模式的局限性?模式有什么用? 最近看到一篇文章对我启发很大,许来西在知乎的回答《哲学和科学有什么关联?》,全篇较长,这里摘录我要引出的一点:...
摘要:相关的网站开发有这么常用的四款数据层视图层控制层框架,我们今天说一下阿里的框架是一个自身功能极简,完全是由路由和中间件构成一个的开发框架安装创建一个目录通过命令为你的应用创建一个文件。修改请求和响应对象。注意只对使用或加载的中间件有效。 express express相关的网站*http://expressjs.com/*http://www.expressjs.com.cn/*htt...
阅读 1266·2021-11-24 09:39
阅读 1517·2021-09-07 09:59
阅读 3479·2019-08-30 15:54
阅读 2474·2019-08-30 11:00
阅读 2669·2019-08-29 15:06
阅读 2160·2019-08-26 13:52
阅读 427·2019-08-26 13:24
阅读 2489·2019-08-26 12:20