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

我正在为 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,听created


public function created(Order $order)

{

    Mail::to($order->customer->email)->send(new OrderMail($order, 'confirmation'));

}

虽然电子邮件已发送出去,但由于 myOrder是在添加 all 之前创建的items,并且观察者会在模型创建后立即触发,所以当我在电子邮件视图中使用关系时,它总是返回空数组


有什么方法可以让我仍然可以将我的电子邮件发送过程与控制器分开,但会等到我的“添加项目到订单”过程完成?


慕的地8271018
浏览 114回答 1
1回答

慕斯王

为了隔离电子邮件进程,您可以使用 Laravel Event/Listener 系统。例如,您可以创建名为的事件OrderSubmitted及其侦听器SendEmailNotification
打开App,查看更多内容
随时随地看视频慕课网APP