Laravel 8 如何在用户下单时向产品所有者发送通知邮件
解决方案
现有代码问题排查
- 控制器参数传递错误:你定义的订单数据变量是
$orderData,但传入通知类的是未定义的$order_file,导致通知类拿不到正确的订单数据 - 需确认User模型已引入Notifiable trait,否则notify方法无法正常调用
- 若.env文件邮件配置未正确配置,会直接导致邮件发送失败
- 当前通知类的邮件按钮文案不合理,直接用user_id作为按钮文字,用户体验差
- 冗余代码:
Order::create($orderData)->save()中create方法已经完成数据写入,额外调用save无意义
修正步骤
1. 修正控制器传参
将下单方法中的通知调用代码修改为:
public function store( Product $product, Request $request) { $orderData = [ 'info' => $request->info, 'min' => $request->min, 'max' => $request->max, 'file' => $file_name, 'product_id' => $product->id, 'user_id' => auth()->id(), 'owner_id' => $product->user->id ]; try { // 去掉冗余的save调用 Order::create($orderData); // 传入正确的订单变量 $product->user->notify(new OrderNotification($orderData)); return redirect()->route('home')->with('status', 'your orders has been sent successfully'); }catch (\Exception $e) { return redirect()->back()->with('status', 'this product has already in your order list'); } }
2. 确认User模型引入Notifiable trait
检查app/Models/User.php,确保类中引入了通知所需的trait:
use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use Notifiable; // 确保存在这行代码 // 其余业务代码保持不变 }
3. 配置.env邮件参数
根据你使用的邮件服务配置.env中的邮件项,QQ/163邮箱示例配置如下:
MAIL_MAILER=smtp MAIL_HOST=smtp.qq.com MAIL_PORT=465 MAIL_USERNAME=你的发件邮箱地址 MAIL_PASSWORD=你的邮箱授权码 MAIL_ENCRYPTION=ssl MAIL_FROM_ADDRESS=你的发件邮箱地址 MAIL_FROM_NAME="${APP_NAME}"
4. 优化通知类邮件内容(可选)
调整邮件的标题、按钮文案和跳转链接,提升可读性:
public function toMail($notifiable) { return (new MailMessage) ->subject('收到新的产品订单') ->line('新订单信息:' . $this->insertOrderData['info']) ->action('查看订单详情', url('/orders/'.$this->insertOrderData['product_id'])) ->line('感谢使用我们的服务!'); }
5. 队列配置(可选)
如果需要异步发送邮件避免请求阻塞,确保运行队列监听命令:
php artisan queue:work
如果不需要异步发送,直接删除通知类里的use Queueable;代码即可改为同步发送。
功能验证
完成上述修改后提交测试订单,查看产品所有者的邮箱是否收到通知即可。如果发送失败,可以查看storage/logs/laravel.log中的错误日志排查具体问题。
内容的提问来源于stack exchange,提问作者Osama Mohammed
相关产品推荐
相关产品推荐

