如何使用Botman.io框架在Telegram中实现非按钮式动态键盘并修复代码问题
Botman.io Telegram 非内嵌按钮式动态键盘实现方案
原代码问题定位
- 变量拼写偏差:创建键盘实例时变量名误写为
$keybord,与后续使用的$keyboard命名不统一,易引发参数传递为空的问题 - 参数格式不符合要求:Botman核心方法要求传入的附加参数需为数组结构,直接传入
Keyboard实例会导致Telegram驱动无法解析键盘结构,也就是你排查到的未调用toArray()的核心问题 - 调用方式冗余:原代码通过
call_user_func_array间接调用addRow方法,可直接使用PHP数组展开语法简化传参逻辑
修正后可运行代码
use BotMan\BotMan\Buttons\Keyboard; use BotMan\BotMan\Buttons\KeyboardButton; // 动态生成按钮文本列表 $buttonTextList = ['test1', 'test2', 'test3']; // 批量生成按钮实例 $buttons = array_map(function ($item) { return KeyboardButton::create($item); }, $buttonTextList); // 创建输入框上方的原生动态键盘(区别于内嵌在消息中的内联按钮键盘) $keyboard = Keyboard::create(Keyboard::TYPE_KEYBOARD); // 展开按钮数组传入addRow,完成一整行按钮的添加 $keyboard->addRow(...$buttons); // 核心修正:将键盘实例转为数组后传入ask方法 $this->ask( 'What is your name', function ($answer) { $this->say('your name is ' . $answer->getText()); }, $keyboard->toArray() );
扩展实现说明
- 自定义行布局:若需要调整按钮换行逻辑,可拆分按钮数组后多次调用
addRow,例如将3个按钮拆分为每行2个的布局:
// 第一行放置前2个按钮 $keyboard->addRow(...array_slice($buttons, 0, 2)); // 第二行放置最后1个按钮 $keyboard->addRow(...array_slice($buttons, 2, 1));
- 专属参数调整:若需要设置键盘收起逻辑、键盘缩放大小等Telegram专属配置,可在
$keyboard->toArray()返回的数组结构基础上追加对应字段,适配Telegram的键盘参数规范。
内容的提问来源于stack exchange,提问作者Solayman Mousa
相关产品推荐
相关产品推荐

