В чем разница между URL-маршрутизатором и диспетчером?

Я хочу знать разницу между URL-маршрутизатором и диспетчером, потому что поиск в Интернете имеет некоторые интересные вещи, просто не знаю, связано ли это с тем, что они похожи, или потому, что они меняют функцию каждого из них. Может ли кто-нибудь сказать мне, что это такое и что каждый, и пример?

Я не знаю отличия от URL Router to Dispatcher, вопрос контента, который у них есть в Интернете, иногда кажется, что диспетчер – это маршрутизатор, а маршрутизатор кажется диспетчером и в конечном итоге не знает, какое право каждого, что такое каждый, и как реализовать каждый из них.

Спасибо.

Related of "В чем разница между URL-маршрутизатором и диспетчером?"

Как ракурсы и библиотеки интерпретируют обязанности маршрутизатора и диспетчера, будут отличаться. Ниже я подробно описываю, как я интерпретирую обязанности этих двух служб. Нельзя сказать, что это единственный способ интерпретировать его или что другие интерпретации ошибочны.

Концепции

маршрутизация

Это похоже на прохождение маршрутов на бензоколонке или в магазине. Вы проходите через город, и вам нужно выяснить, как добраться до ближайшего отеля. Вы заходите и спрашиваете у сопровождающего, и они указывают вас в правильном направлении, или, по крайней мере, вы надеетесь, что направления верны. Маршрутизация – это именно так. Запрос приходит для ресурса, маршрутизатор предоставляет указания, необходимые для запроса, чтобы получить правильный ресурс.

В большинстве основных платформ вы собираетесь маршрутизировать определенный URL-адрес запроса на объект и метод, которые будут вызываться для завершения запроса. Часто вы увидите, что маршрутизатор также анализирует динамические аргументы из URL. Например, если вы обращались к пользователям через /users/1234 где 1234 – это идентификатор пользователя, маршрутизатор будет анализировать часть идентификатора и предоставлять это как часть указаний на ресурс.

Диспетчерская

Диспетчер использует информацию с шага маршрутизации для фактического создания ресурса. Если шаг маршрутизации запрашивает указания, Dispatching – это фактический процесс следования этим направлениям. Dispatching точно знает, что нужно создавать, и шаги, необходимые для создания ресурса, но только после получения маршрутов от маршрутизатора.

Реализации

Эти примеры реализации преднамеренно очень просты и наивны. Вы не захотите использовать это в какой-либо производственной среде без резких улучшений.

В этом примере вместо маршрутизации к объекту и методу мы просто направляемся к вызываемой функции. Это также демонстрирует, что вам не нужно направлять объект; до тех пор, пока диспетчер может правильно получить правильный ресурс, вы можете маршрутизировать любые нужные вам данные.

Сначала нам нужно что-то направить. Давайте создадим простой объект 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 .

Завершение

Предполагается, что в этом примере реализована концепция маршрутизации и диспетчеризации. На самом деле для выполнения этих действий намного больше, чем в моем примере. Часто маршрутизатор будет использовать регулярное выражение для сопоставления с запросом и может искать другие атрибуты запроса при сопоставлении. Кроме того, вы увидите некоторые библиотеки, в которых используется распознаватель, который взаимодействует с маршрутизатором, чтобы вы могли передавать больше, чем просто вызываемые функции. В принципе, Resolver гарантирует, что $handler сопоставленный с, может быть превращен в invokable функцию.

Кроме того, для этого есть много примеров и реализаций, которые вы должны использовать вместо этого. Для моих личных проектов мне нравится FastRoute для простоты использования и производительности. Но почти все основные структуры имеют свои собственные реализации. Вы должны проверить их тоже.