Маршруты
Маршрут — правило, которое связывает адрес страницы с кодом, формирующим ответ. Все маршруты сайта записаны в одном файле — 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) там, где ожидается число.