Loading...
Loading...
Build backend applications with AdonisJS v7, a type-safe Node.js framework with batteries included.
npx skill4agent add enzopita/adonisjs-docs-indexer adonisjshttps://adonisjs-docs-indexer.enzopita.com/llms.txthttps://adonisjs-docs-indexer.enzopita.com/llms-full.txt.mddocs.adonisjs.comhttps://adonisjs-docs-indexer.enzopita.com/llms.txt- [Title](https://docs.adonisjs.com/{permalink}.md): Description of the page
Topics: Heading 1, Heading 2, Heading 3, ...npm init adonisjs@latest my-app
cd my-app
node ace serve --hmr// start/routes.ts
import router from '@adonisjs/core/services/router'
router.get('/', async () => ({ hello: 'world' }))
router.post('/posts', '#controllers/posts_controller.store')
router.resource('posts', '#controllers/posts_controller')
router.group(() => {
router.get('/profile', '#controllers/users_controller.profile')
}).prefix('/api').middleware('auth')// app/controllers/posts_controller.ts
import type { HttpContext } from '@adonisjs/core/http'
export default class PostsController {
async index({ response }: HttpContext) {
return response.ok({ posts: [] })
}
async store({ request }: HttpContext) {
const data = request.only(['title', 'content'])
return data
}
}// app/models/post.ts
import { DateTime } from 'luxon'
import { BaseModel, column, hasMany } from '@adonisjs/lucid/orm'
import type { HasMany } from '@adonisjs/lucid/types/relations'
import Comment from '#models/comment'
export default class Post extends BaseModel {
@column({ isPrimary: true })
declare id: number
@column()
declare title: string
@hasMany(() => Comment)
declare comments: HasMany<typeof Comment>
@column.dateTime({ autoCreate: true })
declare createdAt: DateTime
}import vine from '@vinejs/vine'
const createPostValidator = vine.compile(
vine.object({
title: vine.string().trim().minLength(3).maxLength(255),
content: vine.string().trim(),
})
)
// In controller:
const data = await request.validateUsing(createPostValidator)// Login with session guard
await auth.use('web').login(user)
// Protect routes
router.get('/dashboard', '#controllers/dashboard_controller.index')
.middleware('auth')
// Access authenticated user
const user = auth.user!// WRONG — v6 IoC container imports
import User from 'App/Models/User'
import Route from '@ioc:Adonis/Core/Route'
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
// CORRECT — v7 uses ESM subpath imports
import User from '#models/user'
import router from '@adonisjs/core/services/router'
import type { HttpContext } from '@adonisjs/core/http'// WRONG — ts-node was replaced in v7
import 'ts-node-maintained/register/esm'
// CORRECT
import '@poppinss/ts-exec'// WRONG — renamed in v7 (conflicted with native platform classes)
import { Request, Response } from '@adonisjs/core/http'
Request.macro('foo', () => {})
// CORRECT
import { HttpRequest, HttpResponse } from '@adonisjs/core/http'
HttpRequest.macro('foo', () => {})// WRONG — deprecated in v7
router.makeUrl('posts.show', { id: 1 })
router.makeSignedUrl('posts.show', { id: 1 })
// CORRECT
import { urlFor } from '@adonisjs/core/services/url_builder'
urlFor('posts.show', { id: 1 })
// Edge templates:
// WRONG: route('posts.show', { id: 1 })
// CORRECT: urlFor('posts.show', { id: 1 })// WRONG — these helpers no longer exist
import { getDirname, getFilename, slash, cuid } from '@adonisjs/core/helpers'
// CORRECT
import.meta.dirname // replaces getDirname()
import.meta.filename // replaces getFilename()
import stringHelpers from '@adonisjs/core/helpers/string'
stringHelpers.toUnixSlash() // replaces slash()
// cuid() removed — use crypto.randomUUID() or nanoid{{-- WRONG — 'errors' key was removed in v7 --}}
{{ flashMessages.get('errors.email') }}
{{-- CORRECT --}}
{{ flashMessages.get('inputErrorsBag.email') }}// WRONG — v6 hook names
hooks: {
onBuildStarting: [],
onSourceFileChanged: [],
onDevServerStarted: [],
onBuildCompleted: [],
}
// CORRECT — v7 renamed all hooks
hooks: {
buildStarting: [],
fileChanged: [],
devServerStarted: [],
buildFinished: [],
// New in v7: fileAdded, fileRemoved, devServerStarting, testsStarting, testsFinished
}// WRONG — v6 Inertia config pattern
export default defineConfig({
entrypoint: 'inertia/app/app.tsx',
history: { encrypt: true },
sharedData: { user: (ctx) => ctx.auth.user },
})
// CORRECT — v7 restructured Inertia
export default defineConfig({
// entrypoint removed
encryptHistory: true,
// sharedData removed — use middleware instead
})
// File paths changed: inertia/app/app.tsx → inertia/app.tsx// WRONG — v6 had appKey in config/app.ts
// appKey: env.get('APP_KEY')
// CORRECT — v7 uses dedicated config/encryption.ts
import { defineConfig, drivers } from '@adonisjs/core/encryption'
export default defineConfig({
default: 'legacy',
list: {
legacy: drivers.legacy({
keys: [env.get('APP_KEY')],
}),
},
})// WRONG — v6 glob syntax (glob package)
files: ['tests/unit/**/*.spec(.ts|.js)']
// CORRECT — v7 uses Node.js built-in glob
files: ['tests/unit/**/*.spec.{ts,js}']require()module.exportsexport =@ioc:HttpContextContractRequestContractHttpContextRequest##models/...#controllers/...../../app/models/...youch##controllers/...#models/...node ace make:controllernode ace make:modelnode ace make:migration.md