Traits

traits 使得可以从外部向模型添加功能。

使用模型 traits ,你可以:

  • 向模型类添加新方法。

  • 监听模型钩子。

  • 将方法添加到给定模型的 Query Builder 实例。

创造特质

traits 存储在 app/Models/Traits 目录中。

使用该 make:trait 命令生成 traits 文件:

adonis make:trait Slugify

产量

# 输出
create  app/Models/Traits/Slugify.js

Traits 需要一个 register 接收 Model 类的方法和一个 customOptions 对象作为其参数:

'use strict'

class Slugify {
  register (Model, customOptions = {}) {
    const defaultOptions = {}
    const options = Object.assign(defaultOptions, customOptions)
  }
}

module.exports = Slugify

注册 traits

给 Lucid 模型一样添加一个 traits :

const Model = use('Model')

class User extends Model {
  static boot () {
    super.boot()
    this.addTrait('Slugify')
  }
}

使用选项注册 traits

如果需要,你可以在添加 traits 时传递初始化选项:

const Model = use('Model')

class User extends Model {
  static boot () {
    super.boot()
    this.addTrait('Slugify', {useCamelCase: true})
  }
}

你传递的选项将转发到 traits 的 register() 方法。

传递选项时,建议你定义默认的 traits 选项,如下所示:

const _ = require('lodash')

class Slugify {

  register (Model, customOptions) {
    const defaultOptions = {useCamelCase: false}
    const options = _.extend({}, defaultOptions, customOptions)
  }
}

module.exports = Slugify

扩展模型方法

使用 traits 添加静态和实例模型方法:

class Slugify {

  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 = Slugify

添加模型 Hooks

使用 traits 挂钩到数据库生命周期事件:

class Slugify {

  register (Model, options) {
    Model.addHook('beforeCreate', function (modelInstance) {
      // create slug
    })
  }
}

module.exports = Slugify

扩展查询生成器

使用 traits 将宏添加到模型的 Query Builder 中:

class Slugify {

  register (Model, options) {
    Model.queryMacro('whereSlug', function (value) {
      this.where('slug', value)
      return this
    })
  }
}

module.exports = Slugify

用法

await User.query().whereSlug('some value')
最后一次更新: 7/3/2019, 11:00:54 PM