Функция канала вещания Laravel не сработает

Так что я собираюсь использовать вещание Laravel для приложения чата,

Я следовал подходу Laravel Broadcasting,

  • незакомментированной App\Providers\BroadcastServiceProviderот providers массив внутри config/app.php

  • Зарегистрировался на сайте-пушере, сделал канал и заполнил поля ниже внутри .env файл с информацией о моем канале-отправителе

PUSHER_APP_ID
PUSHER_APP_KEY
PUSHER_APP_SECRET
PUSHER_APP_CLUSTER
  • Внутри моего broadcast.php Конфигурационный файл, где я устанавливаю настройки по умолчанию driver в pusherЯ также добавил
'options' => [
    'cluster' => 'us2',
    'encrypted' => true,
],

в pusher массив внутри connections массив, основанный на моей информации канала в панели толкателя

  • Установил pusher php пакет в моем проекте laravel, используя composer require pusher/pusher-php-server "~3.0" команда

Вот мой класс событий

<?php

namespace App\Events;
use App\User;
use App\TherapyMessage;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use App\AppLog;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;

class TherapyMessageSent implements ShouldBroadcastNow
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * User that sent the message
     *
     * @var User
     */
    public $user;

    /**
     * Message details
     *
     * @var Message
     */
    public $message;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(User $user, TherapyMessage $message)
    {
        $this->user = $user;
        $this->message = $message;
    }

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

        AppLog::create([
            'file_name' => __FILE__,
            'message' => "broadcast before send with Message ID of $message_id from $user->full_name"
        ]);

        return new PrivateChannel("therapy-chat.$message_id");
    }
}

  • AppLog это модель, которую я использую для входа в проект
  • Я пытался реализовать ShouldBroadcast интерфейс сначала, но это тоже не сработало
  • Я также зарегистрировал свое событие внутри EventServiceProvider.php файл и запустить php artisan event:generate команда, вот EventServiceProvider$listen массив:
protected $listen = [
    Registered::class => [
        SendEmailVerificationNotification::class,
        TherapyMessageSent::class
    ],
];

Я также импортировал пространство имен событий рядом с другими пространствами имен внутри файла: use \App\Events\TherapyMessageSent;

Вот канал, который я определил внутри routes/channels.php файл:


use App\AppLog;

Broadcast::channel('therapy-chat.{message_id}', function ($user, $message_id) {

    AppLog::create([
        'file_name' => __FILE__,
        'message' => "broadcast sending with Message ID of $message_id to $user->full_name"
    ]);

    if (!Auth::check()) return false;

    $message = \App\TherapyMessage::find($message_id);

    if (!$message) {

        AppLog::create([
            'file_name' => __FILE__,
            'message' => "Message with ID of $message_id Not Found for broadcasting"
        ]);

        return false;
    }

    $will_send = false;

    if ($therapist = $user->therapist) {
        $will_send = $therapist->id === $message->therapist_id;
    } else if ($patient = $user->patient) {
        $will_send = $message->patient_id === $patient->id;
    }

    if ($will_send) {

        AppLog::create([
            'file_name' => __FILE__,
            'message' => "Message with ID of $message_id broadcasted to $user->full_name"
        ]);
    }

    return $will_send;
});

Наконец, это мой метод контроллера:

public function sendToTherapist(Request $request) {

    $validation = \Validator::make($request->all(), ['message' => 'required']);

    if ($validation->fails()) return $this->validationError($validation);

    $user = \Auth::user();
    $patient = $user->patient;
    $therapist = $patient->therapist;

    if (!$therapist) return $this->errorWithMessage('Patient does not have Therapist');

    $message = \App\TherapyMessage::create([
        'patient_id' => $patient->id,
        'therapist_id' => $therapist->id,
        'type' => TherapyMessageType::TEXT,
        'text' => $request->message,
        'sender_role' => TherapyMessageSenderRole::PATIENT
    ]);

    broadcast(new TherapyMessageSent($user, $message))->toOthers();

    return $this->success(['id' => $message->id]);
}
  • Мой класс контроллера происходит от BaseController, который является классом контроллера с такими вспомогательными методами, как success(), validationError() а также errorWithMessage()

Как вы видите в коде выше, я заполнил $user а также $message с правильными значениями и запрос работает без ошибок

Я думаю, что метод канала не будет даже запущен, так как я проверяю AppLog стол, когда я звоню broadcast метод, только журнал внутри TherapyMessageSent событие broadcastOn функция сохраняется и даже журнал, который я сохраняю в начале channels.php Метод, не сохраняется, поэтому я думаю, что этот метод никогда не выполняется.

Если бы кто-нибудь мог помочь мне с проблемой, я был бы благодарен.

0 ответов

Другие вопросы по тегам