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

السؤال

نشر

عند استخدام 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...