Laravel9添加Facebook webhook时报Response::create()未定义错误
环境信息
- BotMan 版本:2.6.1
- PHP 版本:8.1
- 对接消息服务:Facebook
- 缓存驱动:LaravelCache
- Laravel 版本:9.18
问题描述
Laravel 9环境下运行BotMan对接Facebook时出现报错,需确认最简便的处理方案。
报错提示create方法不存在,疑问点为是否需要新建继承Request的类自行实现create方法。
已尝试将代码中所有引用的Symfony\Component\HttpFoundation\Response替换为Illuminate\Http\Response (and Request),但未解决问题。
执行如下curl请求模拟Facebook webhook验证:
curl -X GET "https://somedomain.org/botman?hub.verify_token=MySecretTokenFromDotENV&hub.challenge=CHALLENGE_ACCEPTED&hub.mode=subscribe"
返回错误响应:
Error: Call to undefined method Symfony\Component\HttpFoundation\Response::create() in file /var/www/nams/botman/driver-facebook/src/FacebookDriver.php on line 120 #0 /var/www/nams/botman/botman/src/Drivers/DriverManager.php(157): BotMan\Drivers\Facebook\FacebookDriver->verifyRequest() #1 /var/www/nams/botman/botman/src/BotMan.php(542): BotMan\BotMan\Drivers\DriverManager::verifyServices() #2 /var/www/nams/botman/botman/src/BotMan.php(421): BotMan\BotMan\BotMan->verifyServices() #3 /var/www/nams/app/Http/Controllers/BotManController.php(40): BotMan\BotMan\BotMan->listen() #4 /var/www/nams/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\Http\Controllers\BotManController->handle()...
复现步骤
- 在Laravel 9项目中从本地路径仓库安装botman,调整composer.json依赖版本适配Laravel 9;
- 按如下代码配置加载Facebook驱动,尝试对接Facebook服务:
$config = [ 'user_cache_time' => 720, 'config' => [ 'conversation_cache_time' => 720 , ], // 驱动专属配置 'facebook' => [ 'token' => env('FACEBOOK_TOKEN'), 'app_secret' => env('FACEBOOK_APP_SECRET'), 'verification' => env('FACEBOOK_VERIFICATION'), ] ]; $botman = app('botman'); DriverManager::loadDriver(\BotMan\Drivers\Facebook\FacebookDriver::class); BotManFactory::create($config, new LaravelCache()); $botman->listen();
- 执行上述curl请求模拟Facebook webhook验证请求,即可触发报错。
触发错误的方法代码如下,初步判断适配新版Laravel/Symfony即可解决,但不清楚具体修复方式:
/** * @param Request $request * @return null|Response */ public function verifyRequest(Request $request) { if ($request->get('hub_mode') === 'subscribe' && $request->get('hub_verify_token') === $this->config->get('verification')) { return Response::create($request->get('hub_challenge'))->send(); } }
解决方案
不需要新建继承Request的类,报错核心原因是Laravel 9依赖的Symfony 6版本HttpFoundation组件移除了Response::create()静态方法,当前使用的BotMan Facebook驱动还在沿用旧版Symfony写法,选以下任意一种方案修复即可:
- 最快临时修复:直接打开报错文件
/var/www/nams/botman/driver-facebook/src/FacebookDriver.php,定位到120行,将原有代码替换为return new \Symfony\Component\HttpFoundation\Response($request->get('hub_challenge'));,注意删除末尾的->send()调用,Laravel路由会自动处理响应发送,手动调用会在新版本中出现输出冲突。该方法缺点是后续composer更新依赖时修改会被覆盖。 - 一劳永逸不修改vendor文件:先安装composer补丁包
cweagans/composer-patches,把上述代码修改做成补丁存放到项目目录,在composer.json中配置补丁规则,后续执行composer更新时补丁会自动生效。 - 适配Laravel原生Response类:打开FacebookDriver.php文件,将头部引用的
use Symfony\Component\HttpFoundation\Response;替换为use Illuminate\Http\Response;,Illuminate提供的Response类仍然保留了静态create方法,同样删除代码末尾的->send()即可,无需修改方法内部的create调用逻辑。
内容的提问来源于stack exchange,提问作者NoAd
相关产品推荐
相关产品推荐

