Botman与Dialogflow中间件分离:用if-else实现分支回复可行吗?
需求可行性与代码修正
你的需求完全可行,这是Botman开发里很常见的「先匹配自定义固定指令,剩余请求交给DialogFlow处理」的场景。不过你当前的代码实现存在逻辑问题,以下是问题分析和修正方案:
现有代码的问题
- 把DialogFlow中间件和
hears监听放在else分支里是错误的:Botman的中间件和消息监听需要全局注册,而非每次收到消息才动态注册,这会导致重复注册、逻辑混乱甚至无法正常触发。 - 直接用
$input == 'School info'做判断脱离了Botman的消息处理流程,没法利用框架自带的匹配机制(比如大小写不敏感匹配、正则匹配等)。
正确的实现方式
正确的做法是:先全局注册DialogFlow中间件,再优先定义自定义指令的监听,最后设置一个兜底监听处理所有未匹配的消息,交给DialogFlow返回结果。
示例代码:
// 全局注册DialogFlow中间件 $dialogflow = DialogFlow::create('en'); $botman->middleware->received($dialogflow); // 优先匹配自定义指令:"School info" $botman->hears('School info', function ($bot) { $bot->reply('Give some info about school'); }); // 兜底处理所有其他输入,使用DialogFlow的回复 $botman->hears('.*', function ($bot) { $extras = $bot->getMessage()->getExtras(); // 确保DialogFlow返回了回复再输出 if (isset($extras['apiReply'])) { $bot->reply($extras['apiReply']); } else { $bot->reply('Sorry, I didn\'t understand that.'); } })->middleware($dialogflow);
说明
- 自定义指令的
hears会优先匹配,只有当用户输入不匹配任何自定义规则时,才会触发兜底的.*正则匹配,调用DialogFlow获取回复。 - DialogFlow中间件全局注册后,会自动处理消息的解析,你只需要在兜底监听中获取
apiReply即可。
内容的提问来源于stack exchange,提问作者Muhammad Hazlan
相关产品推荐
相关产品推荐

