Роутер (Router) отправляет данные различным обработчикам в зависимости от установленных вами правил. Пока что не имеет значения, какой URL-адрес используется для доступа к приложению - результат будет один и тот же. Сейчас мы исправим это.

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

Альтернативы: symfony/Routing, Aura.Router, fuelphp/routing, Klein

Теперь вы знаете, как устанавливать пакеты Composer, поэтому справитесь без труда. А сейчас добавьте этот блок кода в файл Bootstrap.php туда, куда вы в последней главе поместили сообщение «Привет, мир»:

$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;
}

В первой секции кода вы регистрируете доступные маршруты вашего приложения. Во второй - вызывается диспетчер и выполняется соответствующая часть оператора switch. Если маршрут найден, будет вызван соответствующий обработчик. Такая настройка вполне может работать для небольших приложений, но как только вы начнете добавлять разные маршруты, ваш загрузочный файл (Bootstrap.php) быстро засорится.

Итак, давайте вынесем маршруты в отдельный файл.

Создайте файл Routes.php в папке src/. Он должен выглядеть так:

<?php declare(strict_types = 1);

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

Теперь давайте перепишем часть диспетчера маршрутов, задействовав файл Routes.php.

$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, что не оптимально. Поэтому давайте исправим это в следующей части.

Не забывайте коммитить изменения в конце каждой главы.

Источник

Наверх