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

إنشاء أحداث خاصة مع استخدام websockets في لارافيل

Amir Alsaeed

السؤال

عند استخدام websockets في لارافيل، أحاول إنشاء handlers خاصة بأحداث معيّنة، مثل عند إنشاء الاتصال مع المستخدم أو عند إرسال أي رسالة لأي مستخدم كالتالي:

<?php

namespace App\Events;

use App\Models\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Queue\SerializesModels;

class ServerCreated implements ShouldBroadcast
{
    use SerializesModels;

    /**
     * The user that created the server.
     *
     * @var \App\Models\User
     */
    public $user;

    /**
     * Create a new event instance.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('user.'.$this->user->id);
    }
}

ولكن بدلاً من استخدام broadcastOn أو broadcastWith، هل هنالك طريقة عامة أكثر لجميع المستخدمين الذين يزورون صفحة محددة أو عندما يتم إنشاء اتصال محدد مشابه ل socket.io التابع onConnection؟

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

Recommended Posts

  • 0

تتيح websockets في لارافيل إنشاء أحداث خاصة بدءً من إنشاء الاتصال وحتى إنهائه عن طريق استخدام Ratchet:

Ratchet\WebSocket\MessageComponentInterface.

حيث ستمكنك من استخدام onOpen - onClose - onError - onMessage لكل اتصال يتم إنشاؤه مع أي مستخدم، حيث تصبح بالشكل التالي:

namespace App;

use Ratchet\ConnectionInterface;
use Ratchet\RFC6455\Messaging\MessageInterface;
use Ratchet\WebSocket\MessageComponentInterface;

class MyCustomWebSocketHandler implements MessageComponentInterface
{

    public function onOpen(ConnectionInterface $connection)
    {
        // TODO: Implement onOpen() method.
    }
    
    public function onClose(ConnectionInterface $connection)
    {
        // TODO: Implement onClose() method.
    }

    public function onError(ConnectionInterface $connection, \Exception $e)
    {
        // TODO: Implement onError() method.
    }

    public function onMessage(ConnectionInterface $connection, MessageInterface $msg)
    {
        // TODO: Implement onMessage() method.
    }
}

وأيضاً يمكن دمجها مع WebSocketsRouter facade للحصول على الأحداث في صفحة أو route محدد في لارافيل.

حيث يتم استخدام مسارات محددة ضمن routes/web.php بالشكل التالي:

WebSocketsRouter::webSocket('/my-websocket', \App\MyCustomWebSocketHandler::class);

 

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

  • 0

اتصال WebSocket هو اتصال دائم بين المتصفح والخادم. يسمح بالاتصال ثنائي الاتجاه: يمكن للخادم إرسال رسائل إلى المتصفح ويمكن للمتصفح - العميل - الرد عبر نفس الاتصال. هذا يختلف عن Ajax العادي ، وهو اتصال أحادي الاتجاه فقط: يمكن للعميل فقط طلب الأشياء من الخادم.

ولإنشاء أحداث خاصة مع استخدام websockets أنصحك بإسنخدام laravel-websockets package

عند تثبيت الخزمة يمكنك الإستفادة من الدوال على شكل أحداث في كل إتصال مثلا لدينا

onOpen: سيتم استدعاؤه عندما يفتح عميل جديد اتصال webSockets
onMessage: سيتم استدعاؤه عندما يرسل العميل رسالة جديدة عبر webSocket.
onClose سيتم  استدعاؤه عند قطع اتصال العميل (عادةً عن طريق التنقل إلى صفحة أخرى ، أو إغلاق علامة التبويب أو نافذة المتصفح)

     public function onOpen(ConnectionInterface $connection)
    {
        // عند فتح الإتصال
    }
    

    public function onMessage(ConnectionInterface $connection, MessageInterface $message)
    {
        // عند إرسال رسالة عبر الإتصال
    }

    public function onClose(ConnectionInterface $connection)
    {
       // عند إنتهاء الإتصال
    }

    public function onError(ConnectionInterface $connection, Exception $exception)
    {
       // عند حدوث خطأ في لإتصال
    }

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...