Skip to content

Latest commit

 

History

History
67 lines (55 loc) · 3.98 KB

05-router.md

File metadata and controls

67 lines (55 loc) · 3.98 KB

<< HTTP | Контроллер >>

Маршрутизатор

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

В этом руководстве я буду использовать FastRoute. Но вы можете выбрать любою другую библиотеку. Вот несколько альтернативных вариантов: symfony/Routing, Aura.Router, fuelphp/routing, Klein.

Вы уже знаете, как устанавливать сторонние пакеты с помощью Composer, поэтому я опущу подробное описание данного шага. Теперь добавьте данный блок кода в Bootstrap.php, вместо сообщения 'hello world' которое мы добавляли в предыдущем разделе.

$dispatcher = \FastRoute\simpleDispatcher(function (\FastRoute\RouteCollector $r) {
    $r->addRoute('GET', '/hello-world', function () {
        echo 'Hello World';
    });
    $r->addRoute('GET', '/another-route', function () {
        echo 'This works too';
    });
});

$routeInfo = $dispatcher->dispatch($request->getMethod(), $request->getPath());
switch ($routeInfo[0]) {
    case \FastRoute\Dispatcher::NOT_FOUND:
        $response->setContent('404 - Page not found');
        $response->setStatusCode(404);
        break;
    case \FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
        $response->setContent('405 - Method not allowed');
        $response->setStatusCode(405);
        break;
    case \FastRoute\Dispatcher::FOUND:
        $handler = $routeInfo[1];
        $vars = $routeInfo[2];
        call_user_func($handler, $vars);
        break;
}

Сначала мы регистрируем доступные маршруты для нашего приложения. После чего диспетчер получает информацию о маршруте и выполняется определенный блок кода в зависимости от полученой информации. Такая настройка пригодная для небольших приложений. Если ваше приложение начнет разрастаться, файл загрузки может быть загроможден маршрутами. Давайте вынесем их в отдельный файл. Создайте файл Routes.php в директории src/ и вставьте в него следующий код:

<?php declare(strict_types = 1);

return [
    ['GET', '/hello-world', function () {
        echo 'Hello World';
    }],
    ['GET', '/another-route', function () {
        echo 'This works too';
    }],
];

Теперь давайте перепишем блок создания маршрутов:

$routeDefinitionCallback = function (\FastRoute\RouteCollector $r) {
    $routes = include('Routes.php');
    foreach ($routes as $route) {
        $r->addRoute($route[0], $route[1], $route[2]);
    }
};

$dispatcher = \FastRoute\simpleDispatcher($routeDefinitionCallback);

Так выглядит получше, но теперь обработчики запросов находятся в файле Routes.php. Давайте исправим этот момент в следующем разделе.

<< HTTP | Контроллер >>