## Traits
- Viết các chức năng có thể sử dụng chung cho nhiều models
- Viết xử lý các hook cho model
- Viết các method mở rộng cho Query Builder
Một ví dụ cho trait là `SlugifyProvider`.
https://github.com/adonisjs/adonis-lucid-slugify
> adonis install @adonisjs/lucid-slugify
## Tạo mới một Trait
> adonis make:trait NewTrait
==> Output: app/Models/Traits/NewTrait.js
File app/Models/Traits/NewTrait.js
<!-->
'use strict'
class NewTrait {
register (Model, customOptions = {}) {
const defaultOptions = {}
const options = Object.assign(defaultOptions, customOptions)
}
}
module.exports = NewTrait
<-->
## Đăng ký Trait
<!-->
const Model = use('Model')
class User extends Model {
static boot () {
super.boot()
this.addTrait('NewTrait')
}
}
<-->
## Đăng ký Trait với Options
<!-->
const Model = use('Model')
class User extends Model {
static boot () {
super.boot()
this.addTrait('NewTrait', {useCamelCase: true})
}
}
<-->
File app/Models/Traits/NewTrait.js
<!-->
const _ = require('lodash')
class NewTrait {
register (Model, customOptions) {
const defaultOptions = {useCamelCase: false}
const options = _.extend({}, defaultOptions, customOptions)
}
}
module.exports = NewTrait
<-->
## Mở rộng các Model Methods
File app/Models/Traits/NewTrait.js
<!-->
class NewTrait {
register (Model, options) {
// Add a static method
Model.newAdminUser = function () {
let m = new Model()
m.isAdmin = true
return m
}
// Add an instance method
Model.prototype.printUsername = function () {
console.log(this.username)
}
}
}
module.exports = NewTrait
<-->
## Thêm Model Hooks
<!-->
class NewTrait {
register (Model, options) {
Model.addHook('beforeCreate', function (modelInstance) {
// create slug
})
}
}
module.exports = NewTrait
<-->
## Mở rộng Query Builder
<!-->
class NewTrait {
register (Model, options) {
Model.queryMacro('whereSlug', function (value) {
this.where('slug', value)
return this
})
}
}
module.exports = NewTrait
<-->
==>
Sử dụng : `await User.query().whereSlug('some value')`
Không có nhận xét nào:
Đăng nhận xét