Laravel安装CoinPayment插件后用户注册报错求助
嘿,我帮你梳理下这个问题的根源和解决办法:
核心问题在哪?
从错误日志能明显看到,系统在找 App\Providers\App\Jobs\CoinpaymentListener 这个类,但你的 CoinpaymentListener 实际命名空间是 App\Jobs —— 这说明事件监听器的注册路径写错了,多了个多余的 App\Providers\ 前缀。
另外,你的 CoinpaymentListener 代码还有个致命的语法问题:所有业务逻辑直接写在了类的根作用域里,没放在 handle() 方法里——Laravel 的队列任务必须通过 handle() 方法来执行逻辑,不然根本跑不起来。
第一步:修正监听器的注册路径
找到你注册 Illuminate\Auth\Events\Registered 事件的地方(大概率是项目根目录下的 app/Providers/EventServiceProvider.php,或者是插件自带的配置文件),把监听器的路径从 App\Providers\App\Jobs\CoinpaymentListener 改成 App\Jobs\CoinpaymentListener。
举个例子,在 EventServiceProvider 的 $listen 数组里应该改成这样:
protected $listen = [ Illuminate\Auth\Events\Registered::class => [ // 把错误的路径换成正确的 App\Jobs\CoinpaymentListener::class, ], ];
第二步:修复 CoinpaymentListener 的语法错误
我帮你把代码修正了,主要是补了 handle() 方法,还顺便改了一处变量名的错误(原代码里把用户ID和支付记录搞混了):
<?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use App\Payment; use App\User; use Illuminate\Support\Facades\Auth; class CoinpaymentListener implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $transaction; /** * 创建任务实例 * * @return void */ public function __construct($transaction) { $this->transaction = $transaction; } /** * 执行任务逻辑 * * @return void */ public function handle() { if($this->transaction['status'] >= 100 || $this->transaction['status'] == 2) { // 支付完成或排队等待夜间结算,标记为已批准 Payment::where('transactionid', $this->transaction['txn_id'])->update(['status' => 'approved']); $paymentRecord = Payment::where('transactionid', $this->transaction['txn_id'])->select(['userid', 'amount'])->first(); $user = User::where('id', $paymentRecord->userid)->select('amount')->first(); $newAmount = $user->amount + $paymentRecord->amount; User::where('id', $paymentRecord->userid)->update(['amount' => $newAmount]); } elseif($this->transaction['status'] < 0){ // 支付出错,通常是最终状态,但无汇率转换或卖家同意时可能重新开启 Payment::where('transactionid', $this->transaction['txn_id'])->update(['status' => 'cancelled']); } else { // 支付待处理,可选择性在订单页添加备注 if($this->transaction['transaction_type'] == 'new') { $table = new Payment(); $table->userid = Auth::id(); $table->gateway = 'CoinPayment'; $table->amount = $this->transaction['payload']; $table->status = 'pending'; $table->transactionid = $this->transaction['txn_id']; $table->itemname = 'Add Funds'; $table->save(); } } } }
第三步:清理缓存(可选但强烈推荐)
执行下面的命令清除 Laravel 的类缓存,确保新的类路径和修正后的代码能立即生效:
php artisan cache:clear php artisan config:clear php artisan optimize:clear
做完这三步,用户注册时的 BindingResolutionException 错误应该就消失了,支付监听的逻辑也能正常跑起来啦。
内容的提问来源于stack exchange,提问作者user10975763

