模型如果需要一些方法,除了你可以直接把这些方法添加到模型的类里面以外,还可以创建一些 Trait ,在这些 Trait 里面添加一些方法,然后再指定让模型使用这些 Trait,这样模型里面就会拥有在 Trait 上定义的方法了 ..
比如我想在 User 模型上,添加可以判断用户是否拥有指定的权限的方法 .. 需要的方法我们可以把它放在 Trait 里面 ..
先去创建一个 Trait .. 在命令行下面执行一下 adonis make:trait .. 这个 Trait 的名字是 Can ..
在项目里,找到刚才创建的 Trait .. app/Models 下面,会有一个 Traits 目录 .. 打开 Can.js ..
Trait 里面都会有一个 register ,在里面你可以往模型上添加方法 .. 这个方法有个 Model 参数,它表示模型 .. 还有一个 customOptions ,在使用 Trait 的时候可以添加一些选项 ...
打算往模型上添加静态方法,可以把方法添加到 Model 上面 ..
如果要往模型的实例上添加方法,可以这样 .. Model.prototype 后面是方法的名字 .. 比如 can .. 它的值应该是个方法 .. 让它等于 this.can ..
这里的 this 表示这个 Trait 类的实例 ...
在这个类里面,可以再添加一个 can 方法 .. 先让方法 return 一个字符串 .. 在这个方法里面,this 表示的是模型实例 .. 输出一个 this.username .. 因为我知道这个 Trait 会用在用户模型上,所以它里面应该会有 username 这个属性 ..
addTrait
然后在 User 模型上用一下刚才我们创建的 Trait .. 在模型里面可以添加静态的 boot 方法 .. 在这个 boot 方法里面 .. 用一下 this.addTrait .. 添加一个 Can ..
这样在用户模型上就会包含在 Can 这个 Trait 里面给模型添加的 can 这个方法了 ..
演示
现在我们再找地方验证一下 .. 打开应用的路由 .. routes.js .. 然后找个地方,添加一条新的路由 ... 用一下 Route .. get . . 地址是 demo/acl .. 直接给它一个处理方法 ..
方法里面先找到一个用户 .. 添加一个 user .. 表示用户 .. 用一下 User 模型的 find .. 找到以后可以 return 一下执行这个用户模型上的 can 方法返回的东西 ..
在路由文件的顶部,可以再导入需要的这个用户模型 .. 位置是 App/Models/User ..
回到浏览器 .. 访问一下 demo/acl ... 页面上会显示 hello 后面是 id 号是 1 的这个用户的名字 ..
页面上现在显示的文字,就是 Can 这个 trait 里的 can 方法返回的东西,我们把这个 Trait 添加到了 User 模型上,所以在 User 模型上可以使用 can 这个方法 ..