مقدمة :
تخيل أنك تطور متجراً إلكترونياً , و طلب منك إرسال بريد إلكتروني أو إشعار للمستخدم عند إنشاء الطلب أو عند توصيله ,
يمكنك ببساطة أن تضمن كود إرسال البريد الإلكتروني في ملف الكونترولر عند استدعاء دالة التخزين أو دالة تغيير الحالة إلى تم التوصيل ,
كيف أرسل بريد الكتروني في لارافيل
سيعمل الكود بكفاءة , لكن هذا ضد مبادئ الكود النظيف 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)
المراجع :