Функция канала вещания 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
Метод, не сохраняется, поэтому я думаю, что этот метод никогда не выполняется.
Если бы кто-нибудь мог помочь мне с проблемой, я был бы благодарен.