## Routing
Routes được tạo ra để thế giới bên ngoài có thể tương tác với ứng dụng thông qua các URLs
Routes được đăng ký ở file start/routes.js
## Các Routes cơ bản
1. Route cơ bản
- Route.get('/', () => 'Hello Adonis')
tham số đầu tiên là đường dẫn, tham số thứ 2 là nội dung sẽ hiển thị
- Route.get('posts', 'PostController.index')
tham số 2 ở đây là một chỉ định để thực thi request `controller.method`
Khi nhận request này ứng dụng sẽ gọi PostController với action là index để xử lý request.
2. Các phương thức Router sẵn có
<!--
Route.get(url, closure)
Route.post(url, closure)
Route.put(url, closure)
Route.patch(url, closure)
Route.delete(url, closure)
-->
- Đăng ký một route hỗ trợ nhiều phương thức gọi
<!--
Route.route('/', () => {
//
}, ['GET', 'POST', 'PUT'])
-->
- Đăng ký một route trả về một view trực tiếp(thường dùng cho trang tĩnh)
<!-- Route.on('/').render('welcome') -->
Sẽ load file resources/view/welcome.edge
## Các tham số của một Route
1. tham số bắt buộc
Route.get('posts/:id', ({ params }) => {
return `Post ${params.id}`
})
Ở ví dụ trên :id là than số bắt buộc, nếu không có giá trị truyền vào sẽ lỗi.
2. tham số không bắt buộc
Route.get('make/:drink?', ({ params }) => {
// use Coffee as fallback when drink is not defined
const drink = params.drink || 'Coffee'
return `One ${drink}, coming right up!`
})
Ở ví dụ trên :drink? là không bắt buộc phải truyền vào(sử dụng kí tự ?).
## Wildcard Route
Route.get('api/v1/users', closure)
Route.any('*', ({ view }) => view.render('welcome'))
Wildcard Route là route đặc biệt, nhận mọi request vào đây.
Sử dụng cú pháp `Route.any('*', <..>)`
Tất cả các route khác nếu có cần đặt phía trên Wildcard Route,
nếu không thì sẽ không được chạy vào.
## Đặt tên cho các Route
Route.on('/').render('welcome').as('homepage')
Route.get('users', 'UserController.index').as('users.index')
<!-- - sử dụng ở view
- before
<a href="/users">List of users</a>
-after
<a href="{{ route('users.index') }}">List of users</a>
-->
<!-- - sử dụng ở controller
foo ({ response }) {
return response.route('users.index')
}
-->
1. Sử dụng route helper
Route.get('posts/:id', closure).as('posts.show')
==>
<!--
// URL: /post/1
route('posts.show', { id: 1 })
// URL: /post/1?foo=bar
route('posts.show', { id: 1 }, {
query: { foo: 'bar' }
});
<a href="{{ route('posts.show', { id: 1 }, {query: { foo: 'bar' }}) }}">Show post</a>
// URL: https://auth.example.com/login?redirect=%2Fdashboard
route('auth.login', null, {
domain: 'auth.example.com',
protocol: 'https',
query: { redirect: '/dashboard' }
});
-->
## Chỉ định Format khi trả về kết quả (Route Formats)
kiểm tra request format type với `request.format()`
Trả về response format với `.formats(['json'])`
<!-->
// http://localhost:3333/format or /format.html or /format.json
Route.get('/format', async ({ request, view }) => {
console.log(request.format())
if (request.format() === 'json') {
return {name:'test', age: 25}
}
return view.render('welcome')
// return view.render('users.index', { users })
})
// .formats(['json'])
.formats(['json', 'html'], false)
-->
Nếu `.formats(['json', 'html'], true)` thì chỉ chấp nhận `/format.html`
or `/format.json`. `/format` sẽ bị lỗi.
## Route Resources
Sử dụng với Route có đầy đủ CRUD
// Sử dụng
`Route.resource('users', 'UserController')`
// sẽ thay thế cho việc phải liệt kê tất cả các action cần có trong UserController
<!-->
Route.get('users', 'UserController.index').as('users.index')
Route.post('users', 'UserController.store').as('users.store')
Route.get('users/create', 'UserController.create').as('users.create')
Route.get('users/:id', 'UserController.show').as('users.show')
Route.put('users/:id', 'UserController.update').as('users.update')
Route.patch('users/:id', 'UserController.update')
Route.get('users/:id/edit', 'UserController.edit').as('users.edit')
Route.delete('users/:id', 'UserController.destroy').as('users.destroy')
-->
Chức năng này chỉ sẵn có khi binding routes đến một Controller.
Cũng có thể sử dụng để chỉ định cho một action
`Route.resource('posts.comments', 'PostCommentController')`
1. Lọc Route với Filtering Resources
- apiOnly
Route.resource('users', 'UserController').apiOnly()
Sẽ bỏ đi `GET resource/create` và `GET resource/:id/edit` routes
- only
Route.resource('users', 'UserController').only(['index', 'show'])
Chỉ public action index và show.
- except
Route.resource('users', 'UserController').except(['index', 'show'])
Public tất cả action trong UserController ngoại trừ action index và show
2. Resource Middleware
Route.resource('users', 'UserController').middleware(['auth'])
- Chỉ định chỉ gắn middleware cho một số route nhất định
Route.resource('users', 'UserController')
.middleware(new Map([
[['store', 'update', 'destroy'], ['auth']]
]))
3. Resource Formats
Route.resource('users', 'UserController').formats(['json'])
## Routing Domains
Nếu ứng chụng được sử dụng với nhiều domain.
Có thể tách riêng route với từng domain riêng biệt.
Route.group(() => {
Route.get('/', ({ subdomains }) => {
return `The username is ${subdomains.user}`
})
}).domain(':user.myapp.com')
Route.get('/gate', ({ subdomains }) => {
return `The username is ${subdomains.user}`
}).domain('gate.myapp.com')
## Route Groups
1. Prefix
// Grouped
Route.group(() => {
Route.get('users', closure)
Route.post('users', closure)
}).prefix('api/v1')
2. Middleware
Route.group(() => {
//
}).middleware(['auth'])
3. Namespace
Route.group(() => {
// Binds '/users' to 'App/Controllers/Http/Admin/UserController'
Route.resource('/users', 'UserController')
}).namespace('Admin')
4. Formats
Route.group(() => {
//
}).formats(['json', 'html'], true)
5. Domain
Route.group(() => {
//
}).domain('blog.adonisjs.com')
Không có nhận xét nào:
Đăng nhận xét