Kuzzle - 插件间通信(通过方法调用)
Kuzzle - inter-plugins communication (via method calls)
Kuzzle 有没有办法让两个插件相互通信?
假设插件 A 想要在启动时调用插件 B 的方法,甚至在某些用例的运行时。我该怎么做?
目前,无法从另一个插件中检索特定的插件实例。插件管理器在插件初始化时无法访问,但可以通过 Kuzzle 请求以某种方式访问(这不是正确的做法)
function (request) {
const kSymbol = Object.getOwnPropertySymbols(request.context.user)[0];
request.context.user[kSymbol].pluginsManager.MyPlugin.someMethod(...args);
...
}
这个问题背后的想法是在初始化插件时做这样的事情
function init (customConfig, context) {
const { pluginsManager } = context;
const result = pluginsManager.MyPlugin.someMethod(...args);
// make something with the result ?
// For later use of plugins manager perhaps ?
this.context = context
}
看起来 Kuzzle Pipes 是正确的做法,因为它们是同步的和可链接的,但是在触发事件时管道 return 什么都不会
function init (customConfig, context) {
const result = context.accessors.trigger('someEvent', {
someAttribute: 'someValue'
});
console.log(result) // undefined
}
感谢您的帮助!
完全披露:我为 Kuzzle
工作
即使像这样访问 pluginManager
目前可能有效,我们也可能会更改内部实现而不发出警告,因为它没有记录,因此您的插件可能无法在下一版本的 Kuzzle 中工作。
使用另一个插件的功能的最简单方法是通过 custom controller and then call it with the query method of the embedded SDK.
公开一个新的 API 方法
例如,如果您的插件名称在清单中为 notifier-plugin
:
this.controllers = {
email: {
send: request => { /* send email */ }
}
};
然后你可以在另一个插件中这样调用它:
await this.context.accessors.sdk.query({
controller: 'notifier-plugin/email',
action: 'send'
});
请注意,您无法在插件中进行 API 调用 init method。
如果您需要在 Kuzzle 启动时进行 API 调用,那么您可以在 core:kuzzleStart 事件上添加一个 hook/pipe。
this.hooks = {
'core:kuzzleStart': () => this.context.accessors.sdk.query({
controller: 'notifier-plugin/email',
action: 'send'
});
};
最后我注意到您不能像您的示例中那样使用管道 returns,但我提出了一项功能以允许插件开发人员使用管道链 return.
它将在下一版本的 Kuzzle 中提供。
Kuzzle 有没有办法让两个插件相互通信?
假设插件 A 想要在启动时调用插件 B 的方法,甚至在某些用例的运行时。我该怎么做?
目前,无法从另一个插件中检索特定的插件实例。插件管理器在插件初始化时无法访问,但可以通过 Kuzzle 请求以某种方式访问(这不是正确的做法)
function (request) {
const kSymbol = Object.getOwnPropertySymbols(request.context.user)[0];
request.context.user[kSymbol].pluginsManager.MyPlugin.someMethod(...args);
...
}
这个问题背后的想法是在初始化插件时做这样的事情
function init (customConfig, context) {
const { pluginsManager } = context;
const result = pluginsManager.MyPlugin.someMethod(...args);
// make something with the result ?
// For later use of plugins manager perhaps ?
this.context = context
}
看起来 Kuzzle Pipes 是正确的做法,因为它们是同步的和可链接的,但是在触发事件时管道 return 什么都不会
function init (customConfig, context) {
const result = context.accessors.trigger('someEvent', {
someAttribute: 'someValue'
});
console.log(result) // undefined
}
感谢您的帮助!
完全披露:我为 Kuzzle
工作即使像这样访问 pluginManager
目前可能有效,我们也可能会更改内部实现而不发出警告,因为它没有记录,因此您的插件可能无法在下一版本的 Kuzzle 中工作。
使用另一个插件的功能的最简单方法是通过 custom controller and then call it with the query method of the embedded SDK.
公开一个新的 API 方法例如,如果您的插件名称在清单中为 notifier-plugin
:
this.controllers = {
email: {
send: request => { /* send email */ }
}
};
然后你可以在另一个插件中这样调用它:
await this.context.accessors.sdk.query({
controller: 'notifier-plugin/email',
action: 'send'
});
请注意,您无法在插件中进行 API 调用 init method。
如果您需要在 Kuzzle 启动时进行 API 调用,那么您可以在 core:kuzzleStart 事件上添加一个 hook/pipe。
this.hooks = {
'core:kuzzleStart': () => this.context.accessors.sdk.query({
controller: 'notifier-plugin/email',
action: 'send'
});
};
最后我注意到您不能像您的示例中那样使用管道 returns,但我提出了一项功能以允许插件开发人员使用管道链 return.
它将在下一版本的 Kuzzle 中提供。