Rumah > Artikel > pembangunan bahagian belakang > Bagaimana & Bila Untuk Menggunakan Pendengar Acara dalam Contoh Kod Praktikal Laravel
Sistem acara Laravel adalah luar biasa apabila berurusan dengan data yang kompleks dalam apl web kami kerana ia merupakan asas untuk membina apl yang dipisahkan dan sangat kompleks. Panduan ini memberitahu perkara yang sangat terperinci tentang pelaksanaan dan penggunaan pendengaran acara terutamanya pada tahun 2024, memberikan perspektif baharu dengan kandungan yang paling luas dan contoh kod terperinci pendengar acara dalam Laravel 11.
*(A) Memahami Teras Di Sebalik Peristiwa dan Pendengar
*
JADI, MARI KITA PECAHKANNYA, peristiwa dalam Laravel mewakili kejadian tertentu dalam apl. Pendengar ialah kelas yang akan bertindak balas kepada semua acara apl tersebut. Corak ini terus mempromosikan pengasingan kebimbangan dan telah membenarkan kod yang lebih modular dan boleh diuji.
*(B) Mencipta Acara
*
Mari kita mulakan dengan mencipta acara yang kompleks untuk itu kita akan menggunakan perintah Artisan untuk menerangkan dengan lebih baik, kami sangat menyarankan anda untuk melakukannya juga
php artisan make:event OrderPlaced
Arahan ini akan menjana kelas acara baharu dalam direktori apl/Acara. Mari kita periksa kelas acara yang lebih terperinci
`ruang nama AppEvents;
gunakan AppModelsOrder;
gunakan AppModelsUser;
gunakan IlluminateFoundationEventsDispatchable;
gunakan IlluminateQueueSerializesModels;
gunakan IlluminateBroadcastingInteractsWithSockets;
gunakan IlluminateBroadcastingPrivateChannel;
gunakan IlluminateContractsBroadcastingShouldBroadcast;
kelas OrderPlaced melaksanakan ShouldBroadcast
{
gunakan Dispatchable, InteractsWithSockets, SerializesModels;
public $order; public $user; /** * Create a new event instance. * * @param \App\Models\Order $order * @param \App\Models\User $user * @return void */ public function __construct(Order $order, User $user) { $this->order = $order; $this->user = $user; } /** * Get the channels the event should broadcast on. * * @return \Illuminate\Broadcasting\Channel|array */ public function broadcastOn() { return new PrivateChannel('orders.'.$this->user->id); } /** * The event's broadcast name. * * @return string */ public function broadcastAs() { return 'order.placed'; }
}`
Dalam contoh yang diperluaskan ini, kami telah memasukkan kedua-dua model Pesanan dan Pengguna. Ciri SerializesModels telah memastikan model Eloquent kami disiri dan dinyahsiri dengan betul apabila acara itu diserahkan kepada pendengar yang beratur. Kami juga telah melaksanakan antara muka ShouldBroadcast dan mentakrifkan kaedah broadcastOn dan broadcastAs, membenarkan acara ini disiarkan ke soket web untuk kemas kini masa nyata.
*Mencipta Berbilang Pendengar
*
Untuk satu acara, kami mungkin mahukan berbilang pendengar. Marilah kami mencipta dua pendengar untuk acara OrderPlaced kami untuk mengembangkan contoh selanjutnya. Saya hanya mahu anda semua memastikan anda mendapat intipati segala-galanya. Jadi, untuk itu sila lihat contoh kod di bawah
php artisan make:listener SendOrderConfirmation --event=OrderPlaced
php artisan make:listener UpdateInventory --event=OrderPlaced
Jadi sekarang anda akan faham bahawa baris arahan ini akan memberikan kami beberapa kelas pendengar baharu dalam direktori aplikasi/Pendengar kami. Sekarang perkaranya ialah, di bawah ini, kami akan memeriksa pendengar SendOrderConfirmation dan melihat bagaimana ia berkembang lebih jauh
`ruang nama AppListeners;
gunakan AppEventsOrderPlaced;
gunakan AppMailOrderConfirmation;
gunakan IlluminateContractsQueueShouldQueue;
gunakan IlluminateQueueInteractsWithQueue;
gunakan IlluminateSupportFacadesMail;
gunakan IlluminateSupportFacadesLog;
kelas SendOrderConfirmation melaksanakan ShouldQueue
{
gunakan InteractsWithQueue;
/** * The number of times the job may be attempted. * * @var int */ public $tries = 3; /** * Handle the event. * * @param \App\Events\OrderPlaced $event * @return void */ public function handle(OrderPlaced $event) { $order = $event->order; $user = $event->user; try { Mail::to($user->email)->send(new OrderConfirmation($order)); Log::info('Order confirmation email sent', ['order_id' => $order->id, 'user_id' => $user->id]); } catch (\Exception $e) { Log::error('Failed to send order confirmation email', ['order_id' => $order->id, 'user_id' => $user->id, 'error' => $e->getMessage()]); $this->fail($e); } } /** * Handle a job failure. * * @param \App\Events\OrderPlaced $event * @param \Throwable $exception * @return void */ public function failed(OrderPlaced $event, $exception) { Log::error('Order confirmation listener failed', ['order_id' => $event->order->id, 'user_id' => $event->user->id, 'error' => $exception->getMessage()]); }
}`
Pendengar ini telah melaksanakan antara muka ShouldQueue, yang menunjukkan bahawa ia harus beratur. Kami telah menambah pengendalian ralat, pengelogan dan menentukan kaedah yang gagal untuk menangani kegagalan. Sifat $tries akan ditetapkan untuk membenarkan beberapa percubaan sekiranya berlaku kegagalan.
Sekarang, mari kita lihat pada pendengar UpdateInventory
`ruang nama AppListeners;
gunakan AppEventsOrderPlaced;
gunakan IlluminateContractsQueueShouldQueue;
gunakan IlluminateQueueInteractsWithQueue;
gunakan IlluminateSupportFacadesDB;
gunakan IlluminateSupportFacadesLog;
UpdateInventory kelas melaksanakan ShouldQueue
{
gunakan InteractsWithQueue;
/** * Handle the event. * * @param \App\Events\OrderPlaced $event * @return void */ public function handle(OrderPlaced $event) { $order = $event->order; DB::transaction(function () use ($order) { foreach ($order->items as $item) { $product = $item->product; if ($product->stock < $item->quantity) { throw new \Exception("Insufficient stock for product: {$product->id}"); } $product->decrement('stock', $item->quantity); Log::info("Inventory updated", ['product_id' => $product->id, 'quantity' => $item->quantity]); } }); } /** * Handle a job failure. * * @param \App\Events\OrderPlaced $event * @param \Throwable $exception * @return void */ public function failed(OrderPlaced $event, $exception) { Log::error('Failed to update inventory', ['order_id' => $event->order->id, 'error' => $exception->getMessage()]); }
}`
Sekarang, anda akan faham bahawa, pendengar ini ada atas sebab seperti menaik taraf inventori berdasarkan item pesanan dll. Kami telah membungkus kemas kini inventori dalam transaksi pangkalan data untuk memastikan konsistensi data. Kami juga telah menambah semakan ralat untuk mengelakkan stok negatif dan menyertakan pengelogan untuk kemas kini dan kegagalan yang berjaya.
*Mendaftarkan Acara & Pendengar
*
Kami akan mendaftarkan acara dan pendengar ini dalam EventServiceProvider
`gunakan AppEventsOrderPlaced;
gunakan AppListenersSendOrderConfirmation;
gunakan AppListenersUpdateInventory;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
OrderPlaced::class => [
SendOrderConfirmation::class,
UpdateInventory::class,
],
];
/** * Register any events for your application. * * @return void */ public function boot() { parent::boot(); // }
}`
Dispatching Events:
We can dispatch the event from a controller or service class
`use App\Events\OrderPlaced;
use App\Models\Order;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class OrderController extends Controller
{
/**
* Place a new order.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function placeOrder(Request $request)
{
$user = auth()->user();
DB::transaction(function () use ($request, $user) { $order = Order::create($request->all()); $order->user()->associate($user); $order->save(); event(new OrderPlaced($order, $user)); }); return response()->json(['message' => 'Order placed successfully', 'order_id' => $order->id]); }
}`
In this example, we have wrapped the order creation and event dispatching in a database transaction to ensure that both occur successfully or not at all.
Atas ialah kandungan terperinci Bagaimana & Bila Untuk Menggunakan Pendengar Acara dalam Contoh Kod Praktikal Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!