为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel - 与模型观察者发送一对多关系的电子邮件

Laravel - 与模型观察者发送一对多关系的电子邮件

PHP
慕的地8271018 2023-04-21 17:35:28
我正在为 Laravel 中的电子商务应用程序制作订单提交功能。对于每次提交的订单,我都会在我的orders表中创建一条订单记录。然后他们将项目添加到order_items指向我刚刚创建的订单的表中。我的控制器如下:DB::transaction(function () use ($customer, $request) {        $order = Order::create([            'order_number' => Order::createOrderNumber(),            'customer_id' => $customer->id,            'note' => $request->input('note'),            'status' => 'PENDING',            'request_date' => $request->input('date'),        ]);        $parts = json_decode($request->input('parts'));        foreach ($parts as $part) {            foreach ($part->selections as $selection) {                $order_item = OrderItem::create([                    'order_id' => $order->id,                    'selection_id' => $selection->id,                    'quantity' => $selection->quantity,                    'price' => Selection::find($selection->id)->first()->price                ]);                if (isset($selection->file)) {                    $file = $request->file('files')[$selection->file];                    $filename_original = $file->getClientOriginalName();                    $extension = $file->extension();                    $filename = md5(microtime()).'.'.$extension;                    try {                        $file->storeAs('/files/order/'.$order->order_number, $filename);                    } catch (Exception $e) {                    }                    $order_item->filename = $filename;                    $order_item->filename_original = $filename_original;                    $order_item->save();                }            }        }这适用于订单创建。现在,我正在尝试在完成后发送一封包含所有订单详细信息的确认电子邮件。我可以直接将 mailable 添加到我的控制器,这样就可以正常工作了。但我试图通过使用模型观察器将所有“副作用”与控制器分开。所以我试着从观察者那里发送电子邮件Order,听createdpublic function created(Order $order){    Mail::to($order->customer->email)->send(new OrderMail($order, 'confirmation'));}虽然电子邮件已发送出去,但由于 myOrder是在添加 all 之前创建的items,并且观察者会在模型创建后立即触发,所以当我在电子邮件视图中使用关系时,它总是返回空数组有什么方法可以让我仍然可以将我的电子邮件发送过程与控制器分开,但会等到我的“添加项目到订单”过程完成?
查看完整描述

1 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

为了隔离电子邮件进程,您可以使用 Laravel Event/Listener 系统。例如,您可以创建名为的事件OrderSubmitted及其侦听器SendEmailNotification


查看完整回答
反对 回复 2023-04-21
  • 1 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信