Имена маршрутов и группы
Если адрес статьи записан в десяти шаблонах, то при его изменении придётся править все десять. Имя маршрута решает эту проблему: ссылки строятся по имени, а адрес хранится в одном месте. Группы позволяют задать общую часть адреса для нескольких маршрутов сразу.
Имя маршрута
Имя задаёт метод as:
// start/routes.ts
import router from '@adonisjs/core/services/router'
router.get('/posts/:id', async ({ params }) => `Статья ${params.id}`).as('posts.show')Имена принято писать через точку: сначала раздел, затем действие. Команда node ace list:routes покажет имя posts.show рядом с адресом.
Ссылка по имени в шаблоне
В шаблонах Edge есть функция route. Она принимает имя и параметры:
{{-- resources/views/pages/home.edge --}}
<a href="{{ route('posts.show', { id: 5 }) }}">Пятая статья</a>На странице получится ссылка на /posts/5. Если поменять адрес в start/routes.ts на /articles/:id, ссылка изменится сама.
Адрес по имени в коде
В TypeScript адрес строит сам роутер, а редирект на именованный маршрут делает объект ответа:
// start/routes.ts
router.get('/latest', async ({ response }) => {
return response.redirect().toRoute('posts.show', { id: 1 })
})
router.get('/link', async () => {
return router.makeUrl('posts.show', { id: 7 })
})/latest перенаправит браузер на /posts/1, а /link покажет строку /posts/7.
Группы
Метод router.group объединяет маршруты. Общий префикс адреса задаёт prefix, общую приставку имени — as:
// start/routes.ts
router
.group(() => {
router.get('/posts', async () => 'Статьи в админке').as('posts')
router.get('/users', async () => 'Пользователи').as('users')
})
.prefix('/admin')
.as('admin')Получатся маршруты /admin/posts с именем admin.posts и /admin/users с именем admin.users. Позже группам будут назначать middleware, например проверку входа: одна строка защитит все маршруты группы.
Ресурсные маршруты
Для типичного набора действий со статьями есть короткая запись:
// start/routes.ts
const PostsController = () => import('#controllers/posts_controller')
router.resource('posts', PostsController)Одна строка регистрирует семь маршрутов с готовыми именами:
| Метод и адрес | Метод контроллера | Имя |
|---|---|---|
GET /posts | index | posts.index |
GET /posts/create | create | posts.create |
POST /posts | store | posts.store |
GET /posts/:id | show | posts.show |
GET /posts/:id/edit | edit | posts.edit |
PUT /posts/:id | update | posts.update |
DELETE /posts/:id | destroy | posts.destroy |
Контроллеры разобраны в следующем уроке.
Частая ошибка
Если в route() указать имя, которого нет, или забыть параметр, страница упадёт с ошибкой о том, что маршрут не найден или параметр id не передан. Сверяйте имена с выводом node ace list:routes и передавайте все параметры адреса вторым аргументом.