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

كيف تحول laravel public channel ل private channel

Ziyad Hasan

السؤال

أنا أريد أن احول   laravel public channel ل private channel  لكي تعمل مع pusher بدون  laravel echo

و هذا الكود في ملف  events/newNotification  

class NewNotification implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * Create a new event instance.
     *
     * @return void
     */

    protected $user_id;
    protected $comment;
    protected $user_name;
    protected $post_id;
    protected $data;
    protected $time;
    protected $post_user_id;

    public function __construct($data = [])
    {
        $this->user_id      = $data['user_id'];
        $this->user_name    = $data['user_name'];
        $this->comment      = $data['comment'];
        $this->post_id      = $data['post_id'];
        $this->post_user_id = $data['post_user_id'];
        $this->date         = date("Y-m-d", strtotime(Carbon::now()));
        $this->time         = date("h:i A", strtotime(Carbon::now()));
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
    */

    public function broadcastOn()
    {
        return new PrivateChannel('new-notification.'.$this->post_user_id);
        
    }

}

وهذا الكود في ملف blade

 Pusher.logToConsole = true;

    var pusher = new Pusher("4fb4fa908d87ec86abf9", {
        
        
        cluster: 'eu'
    });

    var notificationsWrapper = $('.dropdown-notifications');
    var notificationsToggle = notificationsWrapper.find('a[data-toggle]');
    var notificationsCountElem = notificationsToggle.find('span[data-count]');
    var notificationsCount = parseInt(notificationsCountElem.data('count'));
    var notifications = notificationsWrapper.find('li.scrollable-container');

    // Subscribe to the channel we specified in our Laravel Event
    var channel = pusher.subscribe('private-new-notification.'+1);
    // Bind a function to a Event (the full Laravel class)
    channel.bind('App\\Events\\NewNotification', function (data) {
        var existingNotifications = notifications.html();
        var newNotificationHtml = `<a href="`+data.user_id+`"><div class="media-body"><h6 class="media-heading text-right">` + data.user_name + `</h6> <p class="notification-text font-small-3 text-muted text-right">` + data.comment + `</p><small style="direction: ltr;"><p class="media-meta text-muted text-right" style="direction: ltr;">` + data.date + data.time + `</p> </small></div></div></a>`;
        notifications.html(newNotificationHtml + existingNotifications);
        notificationsCount += 1;
        notificationsCountElem.attr('data-count', notificationsCount);
        notificationsWrapper.find('.notif-count').text(notificationsCount);
        notificationsWrapper.show();
    });
</script>

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1
بتاريخ 29 دقائق مضت قال Ziyad Hasan:

اريد تعديل الكود في ملف blade لكي يعمل مع private channel

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

يتم تحديد قواعد ترخيص القناة الخاصة هاته بنا في ملف :

route / channels.php

الخاص بتطبيقنا . 

تحتاج أولا تعريف القناة بالملف المذكور كالتالي : 

Broadcast::channel('new-notification.{postUserId}' , function ($postUserId) {
    
});

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

يمكنك صياغة منطق الشيفرة وفق حاجتك للقناة الخاصة من الأساس . 

مثلا : 

Broadcast::channel('new-notification.{postUserId}' , function ($postUserId) {
    if(auth()->user()->can_view_notfs_of($postUserId)){
        return true;
    }
});

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

و هذا من جانب الواجهة الخلفية , أما من جانب الواجهة الأمامية فسيتم تحديد نقطة الوصول هاته -نقطة التحقق- بإستعمال الخاصية authEndpoint مرفقا بـ csrf_token  : 

var pusher = new Pusher("4fb4fa908d87ec86abf9", {
        cluster: '{{ env('PUSHER_APP_CLUSTER') }}',
        authEndpoint: '/broadcasting/auth',
        auth: {
             headers: {
                'X-CSRF-TOKEN': '{{ csrf_token() }}',
             }
        }
});

بعد ذلك ستعمل القنوات الخاصة وفق المطلوب .

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

القناة بالإسم : 

'new-notification.'.$this->post_user_id

بالفعل قناة خاصة Private Channel لديك , هلا قمت بتوضيح سؤالك أكثر ؟ 

اقتباس

لكي تعمل مع pusher بدون  laravel echo

يمكنك الإستغناء عن laravel ehco  إن كنت تستخدم pusher كويب سوكيت دريفر , و لا علاقة لذلك بنوع القناة .

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 16 دقائق مضت قال Adnane Kadri:

القناة بالإسم : 


'new-notification.'.$this->post_user_id

بالفعل قناة خاصة Private Channel لديك , هلا قمت بتوضيح سؤالك أكثر ؟ 

يمكنك الإستغناء عن laravel ehco  إن كنت تستخدم pusher كويب سوكيت دريفر , و لا علاقة لذلك بنوع القناة .

اريد تعديل الكود في ملف blade لكي يعمل مع private channel

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...