"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف ومتى يتم استخدام مستمعي الأحداث في أمثلة التعليمات البرمجية العملية لـ Laravel

كيف ومتى يتم استخدام مستمعي الأحداث في أمثلة التعليمات البرمجية العملية لـ Laravel

تم النشر بتاريخ 2024-08-18
تصفح:304

How & When To Use Event Listeners in Laravel  Practical Code Examples

يعد نظام أحداث Laravel استثنائيًا عندما يتعلق الأمر بالتعامل مع البيانات المعقدة في تطبيقات الويب الخاصة بنا لأنه يمثل حجر الزاوية لبناء تطبيقات منفصلة ومعقدة تمامًا. يروي هذا الدليل نقاطًا مفصلة للغاية حول تنفيذ واستخدام الاستماع إلى الأحداث خاصة في عام 2024، مما يوفر منظورًا جديدًا مع المحتوى الأكثر شمولاً وأمثلة التعليمات البرمجية التفصيلية لمستمعي الأحداث في Laravel 11.

*(أ) فهم جوهر الأحداث والمستمعين
*

لذا، دعنا نقسمها، الأحداث في Laravel تمثل أحداثًا محددة داخل التطبيق. المستمعون هم الفئات التي ستستجيب لجميع أحداث التطبيق هذه. يستمر هذا النمط في تعزيز الفصل بين الاهتمامات ويسمح بمزيد من التعليمات البرمجية المعيارية والقابلة للاختبار.

*(ب) إنشاء حدث
*

دعونا نبدأ بإنشاء حدث معقد لذلك سنستخدم الأمر Artisan لشرح أفضل، ونحن نقترح بشدة أن تفعل ذلك أيضًا

صنع PHP الحرفي:حدث OrderPlaced

سيقوم هذا الأمر بإنشاء فئة حدث جديدة في دليل التطبيق/الأحداث. دعونا نتفحص فئة حدث أكثر تفصيلاً

`تطبيق\أحداث مساحة الاسم؛

استخدم التطبيق\النماذج\الطلب؛
استخدم App\Models\User;
استخدم Illuminate\Foundation\Events\Dispatchable;
استخدم Illuminate\Queue\SerializesModels;
استخدم Illuminate\Broadcasting\InteractsWithSockets;
استخدم Illuminate\Broadcasting\PrivateChannel;
استخدم Illuminate\Contracts\Broadcasting\ShouldBroadcast;

تنفذ فئة OrderPlaced يجب البث
{
استخدام 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';
}

}`

في هذا المثال الموسع، قمنا بتضمين نموذجي الطلب والمستخدم. تضمن سمة SerializesModels إجراء تسلسل لنماذج Eloquent وإلغاء تسلسلها بشكل صحيح عند تمرير الحدث إلى المستمعين في قائمة الانتظار. لقد قمنا أيضًا بتنفيذ واجهة ShouldBroadcast وحددنا طرق broadcastOn وbroadcastAs، مما يسمح ببث هذا الحدث إلى websockets للحصول على التحديثات في الوقت الفعلي.

*إنشاء مستمعين متعددين
*

بالنسبة لحدث واحد، قد نحتاج إلى عدة مستمعين. دعونا ننشئ مستمعين لحدث OrderPlaced لتوسيع المثال أيضًا. أريد فقط يا رفاق أن تتأكدوا من حصولكم على جوهر كل شيء. لذلك، يرجى الاطلاع على مثال الكود أدناه

صنع حرفي php:مستمع SendOrderConfirmation --event=OrderPlaced
صنع حرفي php:listener UpdateInventory --event=OrderPlaced

إذن ستدرك الآن أن سطر الأوامر هذا سيوفر لنا فئتين مستمعتين جديدتين في دليل التطبيق/المستمعين الخاص بنا. الآن، هنا أدناه، سوف نقوم بفحص المستمع SendOrderConfirmation ونرى كيف يتقدم أكثر

`تطبيق مساحة الاسم\المستمعون؛

استخدام التطبيق\الأحداث\OrderPlaced؛
استخدم App\Mail\OrderConfirmation;
استخدم Illuminate\Contracts\Queue\ShouldQueue;
استخدم Illuminate\Queue\InteractsWithQueue;
استخدم Illuminate\Support\Facades\Mail;
استخدم Illuminate\Support\Facades\Log;

فئة SendOrderConfirmation تنفذ جديرة بالانتظار
{
استخدم 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()]);
}

}`

يقوم هذا المستمع بتنفيذ واجهة ShouldQueue، مما يشير إلى أنه يجب وضعه في قائمة الانتظار. لقد أضفنا معالجة الأخطاء وتسجيلها وحددنا طريقة فاشلة للتعامل مع حالات الفشل. سيتم تعيين خاصية المحاولات $ للسماح بمحاولات متعددة في حالة الفشل.
الآن، دعونا نلقي نظرة على مستمع UpdateInventory

`تطبيق مساحة الاسم\المستمعون؛

استخدام التطبيق\الأحداث\OrderPlaced؛
استخدم Illuminate\Contracts\Queue\ShouldQueue;
استخدم Illuminate\Queue\InteractsWithQueue;
استخدم Illuminate\Support\Facades\DB;
استخدم Illuminate\Support\Facades\Log;

فئة UpdateInventory تنفذ WorthQueue
{
استخدم 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 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()]);
}

}`

الآن، ستفهم أن هذا المستمع موجود لأسباب مثل ترقية المخزون بناءً على عناصر الطلب وما إلى ذلك. لقد قمنا بتغليف تحديث المخزون في معاملة قاعدة بيانات لضمان اتساق البيانات. لقد أضفنا أيضًا التحقق من الأخطاء لمنع المخزون السلبي وقمنا بتضمين تسجيل التحديثات الناجحة والفشل.

*تسجيل الأحداث والمستمعين
*

سنقوم بتسجيل هذه الأحداث والمستمعين في EventServiceProvider

`استخدام التطبيق\الأحداث\OrderPlaced؛
استخدم App\Listeners\SendOrderConfirmation;
استخدم App\Listeners\UpdateInventory;

يقوم فئة EventServiceProvider بتوسيع ServiceProvider
{
/**
* تعيينات مستمع الحدث للتطبيق.
*
* @فار مجموعة
*/
محمي $listen = [
OrderPlaced::class => [
تأكيد إرسال الطلب::class,
UpdateInventory::class,

];

/**
 * Register any events for your application.
 *
 * @return void
 */
public function boot()
{
    parent::boot();

    //
}

}`

إرسال الأحداث:

يمكننا إرسال الحدث من وحدة تحكم أو فئة خدمة

`استخدام التطبيق\الأحداث\OrderPlaced؛
استخدم App\Models\Order;
استخدم Illuminate\Http\Request;
استخدم Illuminate\Support\Facades\DB;

يقوم OrderController بتوسيع وحدة التحكم
{
/**
* تقديم طلب جديد.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
الوظيفة العامة placeOrder(طلب طلب $)
{
$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]);
}

}`

في هذا المثال، قمنا بتغليف إنشاء الطلب وإرسال الحدث في معاملة قاعدة بيانات للتأكد من حدوث كليهما بنجاح أو عدم حدوثهما على الإطلاق.

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/danish/how-when-to-use-event-listeners-in-laravel-11-practical-code-examples-29mn?1 إذا كان هناك أي انتهاك، من فضلك اتصل بـ [email protected]
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3