我想知道URL Router和Dispatcher之间的区别,因为在互联网上搜索有一些有趣的东西,只是不知道是因为它们相似,还是因为它们颠倒了各自的功能。谁能告诉我这是什么,每一个都是什么,还有一个例子?
我不知道URL Router和Dispatcher的区别,他们在Internet上的内容问题,有时好像Dispatcher就是Router,Router就像Dispatcher,最终不知道每个人的权利是什么,每个人的权利是什么,以及如何实现每个人。
谢谢。
发布于 2012-07-30 01:50:35
框架和库如何解释Router和Dispatcher的职责将是不同的。下面我将详细介绍I如何解释这两个服务的职责。这并不是说这是解释它的唯一方法,也不是说其他解释是错误的。
概念
路由
这有点像在加油站或便利店问路。你要穿过这座城市,你需要弄清楚怎么去最近的旅馆。你进去问服务员,他们给你指了个正确的方向,或者至少你希望方向是正确的。路由就是这样的。当请求进入资源时,路由器提供请求到达正确资源所需的方向。
在大多数主要框架中,您将把特定的请求URL路由到将被调用以完成请求的对象和方法。您经常会看到Router还从URL中解析出动态参数。例如,如果您通过/users/1234访问用户,其中1234是用户ID,则路由器将解析出ID部分,并将其作为指向资源的方向的一部分提供。
调度
调度使用路由步骤中的信息来实际生成资源。如果路由步骤是询问方向,那么调度就是遵循这些方向的实际过程。Dispatching确切地知道要创建什么以及生成资源所需的步骤,但只有在从路由器获得方向之后才能知道。
实现
这些示例实现有意地非常简单和幼稚。如果没有显著的改进,您不会希望在任何类型的生产环境中使用它。
在这个例子中,我们不是路由到对象和方法,而是路由到一个可调用的函数。这也证明了您不需要路由到对象;只要dispatcher能够正确地获得正确的资源,您就可以路由到您想要的任何数据。
首先,我们需要一些路由依据。让我们创建一个可以匹配的简单请求对象。
<?php
class Request {
private $method;
private $path;
function __construct($method, $path) {
$this->method = $method;
$this->path = $path;
}
function getMethod() {
return $this->method;
}
function getPath() {
return $this->path;
}
}现在我们可以匹配一些东西了,让我们来看一个简单的路由器实现。
<?php
class Router {
private $routes = [
'get' => [],
'post' => []
];
function get($pattern, callable $handler) {
$this->routes['get'][$pattern] = $handler;
return $this;
}
function post($pattern, callable $handler) {
$this->routes['post'][$pattern] = $handler;
return $this;
}
function match(Request $request) {
$method = strtolower($request->getMethod());
if (!isset($this->routes[$method])) {
return false;
}
$path = $request->getPath();
foreach ($this->routes[$method] as $pattern => $handler) {
if ($pattern === $path) {
return $handler;
}
}
return false;
}
}现在我们需要一些方法来为给定的请求调用已配置的$handler。
<?php
class Dispatcher {
private $router;
function __construct(Router $router) {
$this->router = $router;
}
function handle(Request $request) {
$handler = $this->router->match($request);
if (!$handler) {
echo "Could not find your resource!\n";
return;
}
$handler();
}
}现在,让我们将它们结合起来,并展示如何使用这些简单的实现。
<?php
$router = new Router();
$router->get('foo', function() { echo "GET foo\n"; });
$router->post('bar', function() { echo "POST bar\n"; });
$dispatcher = new Dispatcher($router);
$dispatcher->handle(new Request('GET', 'foo'));
$dispatcher->handle(new Request('POST', 'bar'));
$dispatcher->handle(new Request('GET', 'qux'));您可以通过查看http://3v4l.org/gbsoJ查看此实现的实际示例。
总结
此示例实现旨在传达路由和调度的概念。实际上,要执行这些操作比我的示例要多得多。通常,路由器将使用正则表达式来匹配请求,并且在匹配时可能会查看其他请求属性。此外,您将看到一些库利用了与Router交互的解析器,因此您可以传递的不仅仅是可调用的函数。基本上,解析器将确保匹配的$handler可以转换为可调用的函数。
此外,您还应该考虑使用大量的示例和实现。对于我的个人项目,我喜欢FastRoute的易用性和性能。但是,几乎所有的主要框架都有自己的实现。你也应该看看这些。
发布于 2021-05-23 20:24:26
路由是对资源的引用,而调度是获取所述资源的动作。
https://stackoverflow.com/questions/11700603
复制相似问题