使用ralphjsmit/laravel-horizon-cron-supervisor时触发BadMethodCallException
问题解决:composer update触发BadMethodCallException(Event::tap不存在)
问题重现
执行composer update时触发错误:
$ composer update ... > Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover --ansi BadMethodCallException Method Illuminate\Console\Scheduling\Event::tap does not exist. at vendor/laravel/framework/src/Illuminate/Macroable/Traits/Macroable.php:113 109▕ */ 110▕ public function __call($method, $parameters) 111▕ { 112▕ if (! static::hasMacro($method)) { ➜ 113▕ throw new BadMethodCallException(sprintf( 114▕ 'Method %s::%s does not exist.', static::class, $method 115▕ )); 116▕ } 117▕ • Bad Method Call: Did you mean Illuminate\Console\Scheduling\Event::at() ? +7 vendor frames 8 artisan:35 Illuminate\Foundation\Console\Kernel::handle()
堆栈追踪指向ralphjsmit/laravel-horizon-cron-supervisor包的SupervisorServiceProvider.php第26行,该代码调用了Laravel 8.x中不存在的tap()方法。
原因分析
- Laravel的
Illuminate\Console\Scheduling\Event::tap()方法是Laravel 9及以上版本才引入的特性 - 当前项目使用Laravel 8.x,而安装的
ralphjsmit/laravel-horizon-cron-supervisorv1.0.1版本依赖了Laravel 9+的API,导致版本不兼容
解决方案
方案1:降级到兼容Laravel 8的包版本
修改composer.json中的依赖,指定支持Laravel 8的包版本:
"ralphjsmit/laravel-horizon-cron-supervisor": "^0.3.0"
然后执行:
composer update ralphjsmit/laravel-horizon-cron-supervisor
方案2:手动替换tap()调用(临时修复)
如果暂时无法降级包,可临时修改vendor/ralphjsmit/laravel-horizon-cron-supervisor/src/Supervisor/SupervisorServiceProvider.php第26行代码:
原调用tap()的代码:
$schedule->command(...)->tap(function () { ... });
替换为Laravel 8支持的写法:
$event = $schedule->command(...); // 将原tap闭包内的逻辑直接执行,比如: $this->resetHorizonSupervisors();
注意:手动修改vendor目录代码会在下次composer update时被覆盖,仅作为应急方案。
方案3:升级Laravel到9+版本
如果项目允许,可升级Laravel框架到9.x版本以兼容该包API:
- 按照Laravel官方升级指南完成版本升级
- 确保其他依赖包也兼容Laravel 9+
内容的提问来源于stack exchange,提问作者jsanmarb
相关产品推荐
相关产品推荐

