URL builder
You may use the URL builder to create URLs for pre-defined routes in your application. For example, create a form action URL inside Edge templates, or make the URL to redirect the request to another route.
The router.builder
method creates an instance of the URL builder class, and you can use the builder's fluent API to lookup a route and create a URL for it.
import router from '@adonisjs/core/services/router'
const PostsController = () => import('#controllers/posts_controller')
router
.get('posts/:id', [PostsController, 'show'])
.as('posts.show')
You may generate the URL for the posts.show
route as follows.
import router from '@adonisjs/core/services/router'
router
.builder()
.params([1])
.make('posts.show') // /posts/1
router
.builder()
.params([20])
.make('posts.show') // /posts/20
The params can be specified as an array of positional arguments. Or you can define them as a key-value pair.
router
.builder()
.params({ id: 1 })
.make('posts.show') // /posts/1
Defining query parameters
The query parameters can be defined using the builder.qs
method. The method accepts an object of key-value pair and serializes it to a query string.
router
.builder()
.qs({ page: 1, sort: 'asc' })
.make('posts.index') // /posts?page=1&sort=asc
The query string is serialized using the qs npm package. You can configure its settings inside the config/app.ts
file under the http
object.
// config/app.js
http: defineConfig({
qs: {
stringify: {
//
}
}
})
Prefixing URL
You may prefix a base URL to the output using the builder.prefixUrl
method.
router
.builder()
.prefixUrl('https://blog.adonisjs.com')
.params({ id: 1 })
.make('posts.show')
Generating signed URLs
Signed URLs are URLs with a signature query string appended to them. The signature is used to verify if the URL has been tampered after it was generated.
For example, you have a URL to unsubscribe users from your newsletter. The URL contains the userId
and might look as follows.
/unsubscribe/231
To prevent someone from changing the user id from 231
to something else, you can sign this URL and verify the signature when handling requests for this route.
router.get('unsubscribe/:id', ({ request, response }) => {
if (!request.hasValidSignature()) {
return response.badRequest('Invalid or expired URL')
}
// Remove subscription
}).as('unsubscribe')
You may use the makeSigned
method to create a signed URL.
router
.builder()
.prefixUrl('https://blog.adonisjs.com')
.params({ id: 231 })
.makeSigned('unsubscribe')
Signed URL expiration
You may generate signed URLs that expire after a given duration using the expiresIn
option. The value can be a number in milliseconds or a time expression string.
router
.builder()
.prefixUrl('https://blog.adonisjs.com')
.params({ id: 231 })
.makeSigned('unsubscribe', {
expiresIn: '3 days'
})
Disabling route lookup
The URL builder performs a route lookup with the route identifier given to the make
and the makeSigned
methods.
If you want to create a URL for routes defined outside of your AdonisJS application, you may disable the route lookup and give the route pattern to the make
and the makeSigned
methods.
router
.builder()
.prefixUrl('https://your-app.com')
.disableRouteLookup()
.params({ token: 'foobar' })
.make('/email/verify/:token') // /email/verify/foobar
Making URL for routes under a domain
You can make URLs for routes registered under a specific domain using the router.builderForDomain
method. The method accepts the route pattern you used at the time of defining the routes.
import router from '@adonisjs/core/services/router'
const PostsController = () => import('#controllers/posts_controller')
router.group(() => {
router
.get('/posts/:id', [PostsController, 'show'])
.as('posts.show')
}).domain('blog.adonisjs.com')
You can create URL for the posts.show
route under blog.adonisjs.com
domain as follows.
router
.builderForDomain('blog.adonisjs.com')
.params({ id: 1 })
.make('posts.show')
Generating URLs inside templates
You may use the route
and the signedRoute
methods inside templates to generate a URL using the URL builder.
See also: Edge helpers reference
<a href="{{ route('posts.show', [post.id]) }}">
View post
</a>
<a href="{{
signedRoute('unsubscribe', [user.id], {
expiresIn: '3 days',
prefixUrl: 'https://blog.adonisjs.com'
})
}}">
Unsubscribe
</a>