URL路由器和调度程序之间的区别是什么


What is the difference between URL Router and Dispatcher?

我想知道URL路由器和Dispatcher之间的区别,因为在互联网上搜索有一些有趣的事情,只是不知道是因为它们相似,还是因为它们颠倒了各自的功能。有人能告诉我它是什么吗?每一个都是什么,还有一个例子吗?

我不知道URL路由器和Dispatcher之间的区别,也不知道它们在互联网上的内容问题,有时看起来Dispatcher就是路由器,而路由器似乎是Dispatcher,最终不知道每一个的权利是什么,每一个是什么,以及如何实现每一个。

谢谢。

框架和库如何解释Router和Dispatcher的职责将有所不同。下面我将详细介绍I如何解释这两个服务的职责。这并不是说这是解释它的唯一方法,也不是说其他解释是错误的。

概念

路由

这有点像在加油站或便利店问路。你要穿过小镇,你需要想办法去最近的酒店。你进去问服务员,他们会给你指正确的方向,或者至少你希望方向是正确的。路由就是这样。当请求进入资源时,路由器会为请求提供到达正确资源所需的方向。

在大多数主要的框架中,您将把一个特定的请求URL路由到一个对象和方法,该对象和方法将被调用以完成请求。您经常会看到路由器也从URL中解析出动态参数。例如,如果您通过/users/1234访问用户,其中1234是用户ID,则路由器将解析出ID部分,并将其作为指向资源的指示的一部分提供。

调度

调度使用路由步骤中的信息来实际生成资源。如果路由步骤是询问方向,那么调度就是遵循这些方向的实际过程。调度准确地知道要创建什么以及生成资源所需的步骤,但只有在从路由器获得指示之后。

实施

这些示例实现有意地非常简单和天真。如果没有大幅改进,您将不希望在任何类型的生产环境中使用此功能。

在这个例子中,我们将不路由到对象和方法,而是路由到一个可调用的函数。这也证明了您不需要来路由到对象;只要调度器能够正确地获得正确的资源,您就可以路由到您想要的任何数据。

首先,我们需要一些可以对抗的东西。让我们创建一个可以匹配的简单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;
    }
}

既然我们可以与某些东西进行匹配,那么让我们来看看一个简单的路由器实现。

<?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.

总结

这个示例实现应该传达路由和调度的概念。实际上,执行这些操作比我的示例要多得多。路由器通常会使用regex与请求进行匹配,并且在匹配时可能会查看其他请求属性。此外,您还会看到一些库使用了一个与Router交互的解析器,这样您就可以传递不仅仅是可调用的函数。基本上,Resolver将确保匹配的$handler可以变成一个可调用的函数。

此外,还有很多这样的例子和实现,您应该考虑使用它们。对于我的个人项目,我喜欢FastRoute的易用性和性能。但是,几乎所有的主要框架都有自己的实现。你也应该看看。

Route是对资源的引用,而Dispatching是获取所述资源的操作。