我想知道URL Router和Dispatcher之间的区别,因为在Internet上进行搜索有一些有趣的事情,只是不知道这是因为它们相似还是因为它们的功能相反。谁能告诉我这是什么,每个是什么,还有一个例子?
我不知道从URL路由器到Dispatcher的区别,也不知道它们在Internet上存在的内容问题,有时似乎Dispatcher是Router,而Router似乎是Dispatcher,最终不知道每个路由器的权利是什么。每一项,以及如何实现。
谢谢你。
最佳答案
框架和库如何解释Router和Dispatcher的职责将有所不同。我在下面详细介绍的是和如何解释这两项服务的职责。并不是说这是解释它的唯一方法,或者其他解释是错误的。
概念
路由
这有点像在加油站或便利店问路。您正在穿过城镇,您需要弄清楚如何前往最近的酒店。您进去问服务员,他们会指出您正确的方向,或者至少您希望方向正确。路由就是这样。对资源的请求进入,路由器提供请求到达正确资源所必需的指示。
在大多数主要框架中,您都会将特定的请求URL路由到将被调用以完成请求的对象和方法。通常,您会看到路由器也从URL解析出动态参数。例如,如果您通过/users/1234
访问用户,其中1234
是用户ID,则路由器将解析出ID部分,并将其作为指向资源的一部分提供。
dispatch
调度使用“路由”步骤中的信息来实际生成资源。如果“路由”步骤要求提供指导,则“分派(dispatch)”是遵循这些指导的实际过程。调度确切知道要创建什么以及生成资源所需的步骤,但仅在从路由器获得指导后才知道。
实现
这些示例实现故意是非常简单和幼稚的。如果不进行重大改进,您将不希望在任何生产环境中使用此功能。
在此示例中,我们将路由到可调用函数,而不是路由到对象和方法。这也表明您不需要路由到一个对象。只要调度程序可以正确获取正确的资源,您就可以将其路由到所需的任何数据。
首先,我们需要采取一些应对措施。让我们创建一个可以匹配的简单Request对象。
<?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;
}
}
现在我们可以匹配某些东西,让我们看一下一个简单的Router实现。
<?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'));
您可以通过 check out http://3v4l.org/gbsoJ来查看此实现的示例。
总结
假定此示例实现传达了路由和调度的概念。实际上,执行这些 Action 比我的示例要多得多。路由器通常会使用正则表达式来与请求进行匹配,并且在匹配时可能会查看其他请求属性。此外,您还将看到一些库利用与路由器交互的解析器,因此您不仅可以传递可调用的函数,还可以传递更多信息。基本上,解析器将确保可以将与之匹配的
$handler
转换为可调用的函数。另外,您应该查看使用的大量示例和实现。对于我的个人项目,我喜欢FastRoute的易用性和性能。但是,几乎所有主要框架都有自己的实现。您也应该检查一下。
关于php - URL Router和Dispatcher有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11700603/