Encodera

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

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

Оглавление

Имена маршрутов и группы

Если адрес статьи записан в десяти шаблонах, то при его изменении придётся править все десять. Имя маршрута решает эту проблему: ссылки строятся по имени, а адрес хранится в одном месте. Группы позволяют задать общую часть адреса для нескольких маршрутов сразу.

Имя маршрута

Имя задаёт метод 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 /postsindexposts.index
GET /posts/createcreateposts.create
POST /postsstoreposts.store
GET /posts/:idshowposts.show
GET /posts/:id/editeditposts.edit
PUT /posts/:idupdateposts.update
DELETE /posts/:iddestroyposts.destroy

Контроллеры разобраны в следующем уроке.

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

Если в route() указать имя, которого нет, или забыть параметр, страница упадёт с ошибкой о том, что маршрут не найден или параметр id не передан. Сверяйте имена с выводом node ace list:routes и передавайте все параметры адреса вторым аргументом.

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

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