内容简介:MVC 框架中的路由器(Router)是如何跑起来的
本文首发于 MVC 框架中的路由器(Router)是如何跑起来的,转载请注明出处。
MVC 路由器(Router)或分发器(Dispatcher)会检测 HTTP 请求的 URL,并尝试将单个 URL 组件与控制器和控制器中定义的方法匹配,同时将所有参数传入方法中。
下面给出了一个简单的路由器类,可以大致阐明路由器是如何工作的。然而在实际项目中,路由器要比下面的示例路由器复杂很多,因为它必须处理更多的东西。
<?php
class SimpleRouter
{
// 路由数组,存储我们定义的路由
private $routes;
// 这个方法用于将定义的路由加入到 $routes 数组
function add_route($route, callback $closure)
{
$this->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 文件中。
<?php
// index.php
class SimpleRouter
{
// 路由数组,存储我们定义的路由
private $routes;
// 这个方法用于将定义的路由加入到 $routes 数组
function add_route($route, callback $closure)
{
$this->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['/']();
上面的示例简单地演示了路由器的工作原理,为了简单起见,我们没有处理任何错误,也没有考虑路由的安全性问题。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 饱受折磨的家用路由器 | 在研究的127个家用路由器中,没有一个路由器幸免
- fl2440制作无线路由器
- 华为路由器BGP邻居详解
- 路由器里的广告秘密
- 自己动手DIY:编译路由器固件
- 小米路由器 3G 刷机及固件
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Refactoring
Martin Fowler、Kent Beck、John Brant、William Opdyke、Don Roberts / Addison-Wesley Professional / 1999-7-8 / USD 64.99
Refactoring is about improving the design of existing code. It is the process of changing a software system in such a way that it does not alter the external behavior of the code, yet improves its int......一起来看看 《Refactoring》 这本书的介绍吧!