- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
想知道URL Router和Dispatcher的区别,因为在网上搜索有一些有趣的东西,就是不知道是因为它们相似,还是因为它们的功能相反。谁能告诉我它是什么,每一个是什么,并举例说明?
不知道URL Router和Dispatcher的区别,网上的内容问题,有时候Dispatcher好像是Router,Router好像是Dispatcher,结果不知道各自的权限是什么,每一个是什么,以及如何实现每一个。
谢谢。
最佳答案
框架和库如何解释 Router 和 Dispatcher 的职责将有所不同。我在下面详细说明的是我如何解释这两个服务的职责。这并不是说这是解释它的唯一方法或其他解释是错误的。
这有点像在加油站或便利店问路。你正在穿过城镇,你需要弄清楚如何到达最近的酒店。你进去问服务员,他们会指出你正确的方向,或者至少你希望方向是正确的。路由就是这样。请求进入资源,路由器提供请求到达正确资源所需的方向。
在大多数主要框架中,您会将特定的请求 URL 路由到将被调用以完成请求的对象和方法。您经常会看到路由器还从 URL 中解析出动态参数。例如,如果您通过 /users/1234
访问用户,其中 1234
是用户 ID,路由器将解析出 ID 部分并将其作为指向资源。
调度使用来自路由步骤的信息来实际生成资源。如果路由步骤是询问方向,那么调度是遵循这些方向的实际过程。 Dispatching 确切地知道要创建什么以及生成资源所需的步骤,但只有在从 Router 获得指示之后。
这些示例实现故意非常简单和幼稚。如果没有大幅改进,您不会希望在任何类型的生产环境中使用它。
在这个例子中,我们只是路由到一个可调用函数,而不是路由到一个对象和方法。这也表明您不需要 路由到一个对象;只要调度程序可以正确获取正确的资源,您就可以路由到您想要的任何数据。
首先我们需要一些路由反对。让我们创建一个可以匹配的简单 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 查看此实现的示例。 .
这个示例实现应该传达路由和调度的概念。实际上,执行这些操作比我的示例要多得多。路由器通常会使用正则表达式来匹配请求,并且在匹配时可能会查看其他请求属性。此外,您将看到一些库使用与路由器交互的解析器,以便您可以传递的不仅仅是可调用函数。基本上,解析器将确保匹配的 $handler
可以转换为可调用函数。
此外,您应该考虑使用大量示例和实现。对于我的个人项目,我喜欢 FastRoute因为它的易用性和性能。但是,几乎所有主要框架都有自己的实现。你也应该检查一下。
关于php - URL Router 和 Dispatcher 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11700603/
我的密码 https://gist.github.com/ButuzGOL/707d1605f63eef55e4af 因此,当我收到登录成功回调时,我想进行重定向, 重定向也可以通过调度程序进行。 我
我已经写了访问者模式如下,但我不明白什么是单次和双次分派(dispatch)。AFAIK,单分派(dispatch)是根据调用者类型调用方法,而双分派(dispatch)是根据调用者类型和参数类型调用
我有一个非 ui 线程,我需要在该线程上发送消息。 执行此操作的正常方法是在我的线程的线程过程中调用 Dispatcher.Run()。 我想修改它以使其在处理未处理的异常方面更加健壮。 我的第一个剪
我有一个具有这样功能的代码 const mapDispatchToProps = (dispatch: Dispatch) => ({ onAddProduct: ( key: str
我在使用 Window.Show 显示 WPF 窗口时遇到问题: System.InvalidOperationException was unhandled Message: An unhandle
我对何时使用 Dispatcher.Invoke 从不同线程更新 UI 上的某些内容存有疑问。 这是我的代码... public Window4() { InitializeC
我遇到了一个我无法解决的问题。我正在构建一个电子商务 react 应用程序并使用 useReducer 和 useContext 进行状态管理。客户打开产品,挑选商品数量,然后单击“添加到购物车”按钮
尽管我已经深入了解了 NEventStore 上的事务完整性,但我无法理解在连接了许多 NEventStore 实例时 NEventStore 将如何真正扩展。 总结一下我的理解,一个事件被添加到提交
我学习了 React Javascript 和 Redux,现在我遇到了这个问题。 这是一个 codesandbox 像这样尝试: 搜索书名“dep” 观察日志显示“Search url is:”,当
Dispatcher.CurrentDispatcher(在System.Windows.Threading中)和Application.Current.Dispatcher(在 >系统.Window
我得到了一些代码来处理调度程序在其构造函数中传递给 View 模型的位置。我现在想知道当我想要在 UI 线程上执行某些操作时,我是否应该使用 ObserveOn(dispatcher) 或 dispa
当我们的一个应用程序服务器内存不足时,我正在分析 Java 堆转储。我正在使用 Eclipse 内存分析器。它报告了以下内容。 One instance of "akka.dispatch.Dispa
哪一个: public static let barrier: DispatchWorkItemFlags public static let detached: DispatchWorkItem
我想使用不同于调度类型的类型提示 Action 创建者。 我已经尝试使用这两种类型对 ThunkResult 进行类型提示,但这并不理想。 // types.ts interface AppListA
我正在尝试准确地理解什么是单次分派(dispatch)和多次分派(dispatch)。 我刚刚读到这个: http://en.wikipedia.org/wiki/Multiple_dispatch
I have following api returning Flux of String我有以下返回字符串通量的接口 @GetMapping(value = "/api/getS
这是我自学前端开发一年后在Stackoverflow上的第一个问题。我已经找到了我的疑惑的答案,但由于这些问题是第三次返回,我认为是时候向 Web 提问了。 我正在尝试构建什么 我正在尝试构建一个图书
我正在使用 Kotlin 学习 Android,并且我了解到在不阻塞主线程的情况下启动协程的推荐方法是执行以下操作 MainScope().launch { withContext(Dispatc
错误本身: (alias) deleteCategory(id: number): (dispatch: Dispatch) => void import deleteCategory Argumen
我必须对抽屉进行裁剪,然后创建一个包含所有需要项的DrawerComponent,并创建一个带有NavigationActions的函数来调度我的路线,但是它不起作用。当我单击任何项目时,我都会遇
我是一名优秀的程序员,十分优秀!