Метод toBroadcast
Метод toBroadcast определяется внутри класса уведомления и указывает,
какие данные должны быть отправлены через канал трансляции (broadcast).
Метод принимает экземпляр Notifiable (обычно модель пользователя)
и должен возвращать массив данных, который будет передан в событие
трансляции. Этот метод используется только если канал broadcast
указан в методе via.
Синтаксис
<?php
public function toBroadcast($notifiable)
{
return [
'data' => [
'key' => 'value',
],
];
}
?>
Метод может возвращать массив с ключом 'data',
содержащим основные данные уведомления.
Если ключ 'data' не указан,
весь массив будет использован как данные.
Пример
Давайте создадим уведомление для трансляции информации о новом комментарии:
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
class CommentNotification extends Notification implements ShouldQueue
{
use Queueable;
protected $comment;
protected $user;
public function __construct($comment, $user)
{
$this->comment = $comment;
$this->user = $user;
}
public function via($notifiable)
{
return ['broadcast', 'database'];
}
public function toBroadcast($notifiable)
{
return [
'data' => [
'comment_id' => $this->comment->id,
'user_name' => $this->user->name,
'comment_text' => $this->comment->text,
'created_at' => now()->toDateTimeString(),
],
];
}
}
?>
Теперь отправим это уведомление пользователю:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Models\Comment;
use App\Notifications\CommentNotification;
use Illuminate\Http\Request;
class CommentController extends Controller
{
public function store(Request $request)
{
$comment = Comment::create($request->all());
$user = User::find(1);
$user->notify(new CommentNotification($comment, auth()->user()));
return response()->json(['status' => 'success']);
}
}
?>
Пример
Метод toBroadcast также может возвращать
дополнительные параметры трансляции с ключом
'broadcast', например, для указания
кастомного события:
<?php
namespace App\Notifications;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Events\Dispatcher;
class StatusNotification extends Notification
{
protected $status;
public function __construct($status)
{
$this->status = $status;
}
public function via($notifiable)
{
return ['broadcast'];
}
public function toBroadcast($notifiable)
{
return [
'data' => [
'status' => $this->status,
'user_id' => $notifiable->id,
],
'broadcast' => [
'event' => 'App\Events\StatusUpdated',
],
];
}
}
?>
Результат отправки уведомления:
"Notification sent and broadcasted"
Пример
Для обработки трансляции на клиентской стороне используйте Laravel Echo:
<script>
import Echo from 'laravel-echo';
import Pusher from 'pusher-js';
window.Pusher = Pusher;
const echo = new Echo({
broadcaster: 'pusher',
key: 'your-key',
cluster: 'mt1',
wsHost: 'ws-mt1.pusher.com',
wsPort: 80,
});
echo.private('App.Models.User.' + userId)
.notification((notification) => {
console.log('Notification received:', notification);
// Здесь можно отобразить уведомление в интерфейсе
});
</script>
Результат выполнения кода в браузере:
<div>Notification received: {
"comment_id": 1,
"user_name": "John",
"comment_text": "Hello world!",
"created_at": "2024-01-15 12:30:00"
}</div>
Смотрите также
-
метод
via,
который определяет каналы доставки уведомления -
метод
notify,
который отправляет уведомление модели -
класс
Notification,
базовый класс для создания уведомлений -
метод
toArray,
который определяет данные для базы данных