内容简介: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 刷机及固件
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Effective JavaScript
David Herman / Addison-Wesley Professional / 2012-12-6 / USD 39.99
"It's uncommon to have a programming language wonk who can speak in such comfortable and friendly language as David does. His walk through the syntax and semantics of JavaScript is both charming and h......一起来看看 《Effective JavaScript》 这本书的介绍吧!