Thứ Ba, 13 tháng 4, 2021

Routing trong AdonisJS




## 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``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

Học lập trình web căn bản với PHP

Bài 1: Các kiến thức căn bản Part 1:  https://jimmyvan88.blogspot.com/2012/05/can-ban-lap-trinh-web-voi-php-bai-1-cac.html Part 2:  https://...