Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Маршруты

Маршрут — правило, которое связывает адрес страницы с кодом, формирующим ответ. Все маршруты сайта записаны в одном файле — app/Config/Routes.php. Адрес, которого в этом файле нет, вернёт ошибку 404.

Простой маршрут

Файл уже существует, в нём есть маршрут главной страницы. Добавьте ниже свой:

// app/Config/Routes.php
$routes->get('hello', static function () {
    return 'Привет!';
});

Откройте http://localhost:8080/hello — на странице появится слово «Привет!». Первый аргумент — адрес без начальной косой черты, второй — функция, которая возвращает ответ.

Маршрут к контроллеру

Обычно код ответа держат не в файле маршрутов, а в контроллере — отдельном классе. Тогда вторым аргументом пишут имя класса и метода:

$routes->get('/', 'Home::index');
$routes->get('posts', 'Posts::index');

Адрес /posts вызовет метод index() класса Posts из папки app/Controllers. Контроллерам посвящён следующий урок.

Методы HTTP

У каждого метода запроса свой метод маршрута:

$routes->get('posts', 'Posts::index');
$routes->post('posts', 'Posts::create');
$routes->delete('posts/(:num)', 'Posts::delete/$1');

get открывает страницы, post принимает формы, put и delete используют для изменения и удаления.

Параметры

Часть адреса в скобках — параметр. Запись $1 передаёт его в метод первым аргументом:

$routes->get('posts/(:num)', 'Posts::show/$1');

Адрес /posts/5 вызовет show(5), а /posts/abc вернёт 404: метка (:num) пропускает только цифры.

МеткаЧему соответствует
(:num)Только цифры
(:alpha)Только буквы
(:segment)Любой текст без косой черты
(:any)Всё до конца адреса

Имена маршрутов

Маршруту дают имя, чтобы ссылаться на него, не повторяя адрес:

$routes->get('posts/(:num)', 'Posts::show/$1', ['as' => 'posts.show']);

Адрес по имени строит функция url_to():

echo url_to('posts.show', 5); // http://localhost:8080/posts/5

Если адрес в маршруте изменится, ссылки по имени продолжат работать.

Группы

Маршруты с общим началом адреса объединяют в группу:

$routes->group('admin', static function ($routes) {
    $routes->get('posts', 'Admin\Posts::index'); // /admin/posts
    $routes->get('users', 'Admin\Users::index'); // /admin/users
});

Список всех маршрутов печатает команда php spark routes.

Частая ошибка

Маршруты проверяются сверху вниз, и срабатывает первый подходящий. Если posts/(:segment) стоит выше, чем posts/new, адрес /posts/new попадёт в первый маршрут. Ставьте точные адреса раньше адресов с параметрами и используйте (:num) там, где ожидается число.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.