مقدمة : 

 

تخيل أنك تطور متجراً إلكترونياً , و طلب منك إرسال بريد إلكتروني أو إشعار للمستخدم عند إنشاء الطلب أو عند توصيله , 

يمكنك ببساطة أن تضمن كود إرسال البريد الإلكتروني في ملف الكونترولر عند استدعاء دالة التخزين أو دالة تغيير الحالة إلى تم التوصيل ,

كيف أرسل بريد الكتروني في لارافيل

سيعمل الكود بكفاءة , لكن هذا ضد مبادئ الكود النظيف clean code و سيراكم عليك العمل و سيصعب التعديل والصيانة , كما أن الحدث يمكن جدولته أو تنفيذه في الخلفية وذلك لتحسين أداء التطبيق والاستجابة السريعة للمستخدم .

 

 

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

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

 

 

 

كيف أبدأ : 

 

أولاً يجب عليك تسجيل الحدث والمستمع له داخل ملف EventServiceProvider.php كالتالي : 

 

  
protected $listen = [
	// موجود مسبقاً
   Registered::class => [
     SendEmailVerificationNotification::class,
   ],
// نضيف الكود هنا 
    'App\Event\OrderCreated' => [
     'App\Listeners\SendOrderCreatedEmail'
   ]
];
 

 

 

وبعدها نستعمل أمر Artisan لتوليد الملفات من المدخلات السابقة : 

 

  
php artisan event:generate

 

 

الآن أصبح لدينا ملفين : 

ملف الحدث في المسار app\Event

ملف المستمع للحدث في المسار app\Listeners

 

 

 

آلية عمل ملف الحدث Event

 

  

namespace App\Event;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class OrderCreated
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    // المتغيرات التي نريد تمريرها للمستمع
    public $order_id;
    public $user_email;
    //
    
    public function __construct($order_id,$user_email)
    {
        $this----->order_id = $order_id;
        $this->user_email = $user_email;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}

 

 

آلية عمل ملف المستمع Listener

 

  
namespace App\Listeners;

use App\Event\OrderCreated;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;

class SendOrderCreatedEmail
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  \App\Event\OrderCreated  $event
     * @return void
     */
    public function handle(OrderCreated $event)
    {
        Log::info($event----->order_id);
        //التعامل مع المتغيرات الممررة من الحدث

        Mail::to($event->user_email);
        // هنا يمكنك معالجة إرسال الإيميل

    }
}

 

 

استدعاء الحدث : 

بعد تعريف آليات العمل لكل من الحدث والمستمع , نقوم باستدعاء الحدث في الكونترولر ونمرر له البيانات ليتم تنفيذه بكل ببساطة , على الشكل التالي : 


namespace App\Http\Controllers;

use App\Event\OrderCreated;
use App\Models\Order;
use Illuminate\Http\Request;

class OrderController extends Controller
{
    public function create(Request $request)
    {
        //order create function
        $order = new Order();
        //here you can fill order data from request


        event (new OrderCreated($order----->id,"[email protected]"));
        // Dispatch event
    }
}

 يمكنك الإطلاع على الكود كاملاً على الرابط التالي : 

husam-hammad/laravel-events-and-listeners: Learn about Event & Listener in Laravel (github.com)

 

المراجع  : 

 

Events - Laravel - The PHP Framework For Web Artisans