اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

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

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

قد تسأل لماذا نستخدم هذه الخصائص ! تُساعد هذه الخصائص كثيراً في تحقيق مبادئ تصميم البرمجيات (SOLID) حيث أن أحد هذه المبادئ مبدأ SRP اي Single Responsibility Principle و يعني ببساطة أن كل وحدة او كلاس أو دالة يجب عليها أن تقوم بمسؤولية واحدة فقط.

قد نرغب في تطبيقنا عند إنشاء منشور ما أن نُرسل إشعار إلى كافة المستخدمين عن طريق البريد الإلكتروني بوجود منشور جديد:

نقوم بإنشاء الحدث و المستمع عن طريق الأمر:

php artisan make:event PostCreated
php artisan make:listener NotifyPostCreated --event="PostCreated"

سيُنشئ الأمر أعلاه ملف للحدث بالإسم PostCreated بداخل المسار app/Events و ملف للمستمع بالإسم NotifyPostCreated بداخل المسار app/Listeners 

بعد ذلك ، تحتاج إلى تسجيل الأحداث والمستمعين في ملف EventServiceProvider.php. في المسار app/Providers:

use App/Events/PostCreated;
use App/Listeners/NotifyPostCreated;

//...

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
protected $listen = [
    //...
    PostCreated::class => [
        NotifyPostCreated::class,
    ],
];

في المصفوفة listen$ مع إستدعاء الكلاسات في الأعلى.

الآن بعد أن قمنا بإعداد الأحداث والمستمعين ، كل ما تبقى هو تحديد بعض المنطق داخل الحدث والمستمع. ثم ، أخيرًا إرسال الحدث.

أولاً ، لنبدأ بفئة الحدث PostCreated التي أنشأناها سابقًا. ما نريده هو إخطار المستخدمين في كل مرة يتم فيها إنشاء منشور جديد.

لذلك ، سنحتاج إلى تمرير كائن post الفعلي إلى باني الفئة PostCreated هذه. سنتعلم كيفية إرسال حدث في وقت لاحق ، ولكن الغرض من ذلك هو إتاحة الوصول إلى الكائن post بين جميع المستمعين.

# app/Events/PostCreated.php

<?php
 
namespace App\Events;
 
....
use App\Post;
 
class PostCreated
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
 
    public $post;
 
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(Post $post)
    {
        $this->post = $post;   
    }
}

ثانيًا ، ستحتفظ فئة المستمع NotifyPostCreated بالمنطق الفعلي لإرسال البريد الإلكتروني إلى المستخدمين.

لاحظ أن هناك تابع handle، هذا هو التابع الذي سيتم استدعاؤه بواسطة الحدث وضمن هذا التابع سنكتب كل الكود اللازم لإرسال البريد الإلكتروني

# app/Events/NotifyPostCreated.php

<?php
 
namespace App\Listeners;
 
use App\Events\PostCreated;
use App\User;
use Mail;
 
class NotifyPostCreated
{
    ....
    ....
 
    /**
     * Handle the event.
     *
     * @param  PostCreated $event
     * @return void
     */
    public function handle(PostCreated $event)
    {
        // Access the post using $event->post...
        $users = User::all();

        foreach($users as $user) {
           Mail::to($user)->send('emails.post.created', $event->post);
        }
    }
}

يرجى ملاحظة أنني استخدمت واجهة Mail لإرسال بريد إلكتروني وقمت بتهيئة بيانات اعتماد البريد وفقًا لذلك وأنشأت أيضًا ملفًا لمحتوى البريد الإلكتروني في Resources / views / emails / post / created.blade.php.

يُمكن أيضاً إنشاء صنف Notification للتعامل مع الإشعار بشكل مبسط بحيث تُصبح عملية الإخطار بالشكل التالي:

$users = User::all();

foreach($users as $user) {
  $user->notify(new PostCreatedNotification($post));
}

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

# app/Http/Controllers/PostController.php

<?php

namespace App\Http\Controllers;

use App\Events\PostCreated;
use App\Http\Controllers\Controller;
use App\Post;

class PostController extends Controller
{
    //...

    public function store(Request $request)
    {
        // post storing logic...

        event(new PostCreated($post));
    }
}

بدلاً من ذلك ، إذا كان حدثك يستخدم Dispatchable trait ، فيمكنك استدعاء التابع الثابت dispatch بهذا الشكل:

//...

public function store(Request $request)
{
    // post storing logic...

    PostCreated::dispatch($post);
}

إفتراضياً لارفل تستخدم نفس العملية عند تسجيل مستخدم جديد لإرسال بريد إلكتروني لتأكيد الحساب.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...