在广播 laravel 通知时应使用什么事件名称
what event-name should be used on broadcasting laravel notifications
我想进行实时laravel通知。
为此我做了所有 configurations described in docs。
我的通知class是:
class NewChangeRegisterStatusNotif extends Notification
{
use Queueable;
public function __construct ($status_id, $course_id)
{
$this->status = CourseUserStatus::findOrFail($status_id);
$this->course = Course::findOrFail($course_id)->first(['title']);
}
public function via ($notifiable)
{
return ['database', 'broadcast'];
}
public function toMail ($notifiable)
{
return (new MailMessage)
->line('The introduction to the notification.')
->action('Notification Action', 'https://laravel.com')
->line('Thank you for using our application!');
}
public function toArray ($notifiable)
{
return [
'message' =>
'Some Messages'
,
'action' => '#'
];
}
}
在下面的代码中,创建一个新的通知:
$user = User::findOrFail($user_id);
$user->notify(new NewChangeRegisterStatusNotif($value, $course_id));
这是 javascript 用于绑定和接收推送事件的客户端代码:
<script src="{{asset('link/to/pusher.min.js')}}"></script>
<script>
Pusher.log = function (msg) {
console.log(msg);
};
var pusher = new Pusher("{{env("PUSHER_KEY")}}");
var channel = pusher.subscribe('App.User.1');
channel.bind('Illuminate\Notifications\Events\BroadcastNotificationCreated', function (data) {
console.log(data);
});
</script>
在 Debug Console Pusher 中订阅 App.User.1
成功。
Laravel 日志中还显示以下消息:
[11:08:31] LOG.info: Broadcasting [Illuminate\Notifications\Events\BroadcastNotificationCreated] on channels [private-App.User.1] with payload:
{
"message": "Some Message",
"action": "#",
"id": "57d9e4dd-09cd-4cd2-ba3d-06f3fcf2af84",
"type": "App\Notifications\NewChangeRegisterStatusNotif",
"socket": null
}
但问题是 channel.bind()
没有触发。
如您所见,我将 Illuminate\Notifications\Events\BroadcastNotificationCreated
传递给它并尝试将其转义 Illuminate\Notifications\Events\BroadcastNotificationCreated
但其中 None 不起作用。
什么是问题?
更新:
我发现尽管laravel发出了Broadcasting事件,但是它并没有发送给pusher或者Pusher收不到。
您能否登录 Pusher 仪表板,转到调试控制台,然后粘贴从 Laravel 代码触发时出现的事件的 JSON?
我怀疑您看不到它们的原因是因为您需要绑定到 private-App.User.1
而不仅仅是 App.User.1
.
通过执行以下操作,我的问题已解决:
1- 在第 18 行的 config/broadcasting.php 文件中,我将 'default' => env('BROADCAST_DRIVER', 'pusher'),
更改为 'default' => 'pusher',
.
2- 将 var channel = pusher.subscribe('App.User.1');
更改为 var channel = pusher.subscribe('private-App.User.{{$AuthUser->user_id}}');
3- 转义 channel.bind('Illuminate\Notifications\Events\BroadcastNotificationCreated'
到 channel.bind('Illuminate\Notifications\Events\BroadcastNotificationCreated'
我还遵循了
中描述的所有说明
简单的给你Event加上这个方法Class
public function broadcastAs()
{
return 'event-name';
}
您可以在 laravel 文档中阅读更多内容
https://laravel.com/docs/5.8/broadcasting#defining-broadcast-events
在 "Broadcast Name"
部分
默认情况下,Laravel 将使用事件的 class 名称广播事件。但是,您可以通过在事件上定义 broadcastAs 方法来自定义广播名称:
/**
* The event's broadcast name.
*
* @return string
*/
public function broadcastAs()
{
return 'server.created';
}
如果您使用 broadcastAs 方法自定义广播名称,您应该确保使用前导 .特点。这将指示 Echo 不要将应用程序的命名空间添加到事件中:
.listen('.server.created', function (e) {
//....
});
我想进行实时laravel通知。
为此我做了所有 configurations described in docs。
我的通知class是:
class NewChangeRegisterStatusNotif extends Notification
{
use Queueable;
public function __construct ($status_id, $course_id)
{
$this->status = CourseUserStatus::findOrFail($status_id);
$this->course = Course::findOrFail($course_id)->first(['title']);
}
public function via ($notifiable)
{
return ['database', 'broadcast'];
}
public function toMail ($notifiable)
{
return (new MailMessage)
->line('The introduction to the notification.')
->action('Notification Action', 'https://laravel.com')
->line('Thank you for using our application!');
}
public function toArray ($notifiable)
{
return [
'message' =>
'Some Messages'
,
'action' => '#'
];
}
}
在下面的代码中,创建一个新的通知:
$user = User::findOrFail($user_id);
$user->notify(new NewChangeRegisterStatusNotif($value, $course_id));
这是 javascript 用于绑定和接收推送事件的客户端代码:
<script src="{{asset('link/to/pusher.min.js')}}"></script>
<script>
Pusher.log = function (msg) {
console.log(msg);
};
var pusher = new Pusher("{{env("PUSHER_KEY")}}");
var channel = pusher.subscribe('App.User.1');
channel.bind('Illuminate\Notifications\Events\BroadcastNotificationCreated', function (data) {
console.log(data);
});
</script>
在 Debug Console Pusher 中订阅 App.User.1
成功。
Laravel 日志中还显示以下消息:
[11:08:31] LOG.info: Broadcasting [Illuminate\Notifications\Events\BroadcastNotificationCreated] on channels [private-App.User.1] with payload:
{
"message": "Some Message",
"action": "#",
"id": "57d9e4dd-09cd-4cd2-ba3d-06f3fcf2af84",
"type": "App\Notifications\NewChangeRegisterStatusNotif",
"socket": null
}
但问题是 channel.bind()
没有触发。
如您所见,我将 Illuminate\Notifications\Events\BroadcastNotificationCreated
传递给它并尝试将其转义 Illuminate\Notifications\Events\BroadcastNotificationCreated
但其中 None 不起作用。
什么是问题?
更新:
我发现尽管laravel发出了Broadcasting事件,但是它并没有发送给pusher或者Pusher收不到。
您能否登录 Pusher 仪表板,转到调试控制台,然后粘贴从 Laravel 代码触发时出现的事件的 JSON?
我怀疑您看不到它们的原因是因为您需要绑定到 private-App.User.1
而不仅仅是 App.User.1
.
通过执行以下操作,我的问题已解决:
1- 在第 18 行的 config/broadcasting.php 文件中,我将 'default' => env('BROADCAST_DRIVER', 'pusher'),
更改为 'default' => 'pusher',
.
2- 将 var channel = pusher.subscribe('App.User.1');
更改为 var channel = pusher.subscribe('private-App.User.{{$AuthUser->user_id}}');
3- 转义 channel.bind('Illuminate\Notifications\Events\BroadcastNotificationCreated'
到 channel.bind('Illuminate\Notifications\Events\BroadcastNotificationCreated'
我还遵循了
中描述的所有说明简单的给你Event加上这个方法Class
public function broadcastAs()
{
return 'event-name';
}
您可以在 laravel 文档中阅读更多内容 https://laravel.com/docs/5.8/broadcasting#defining-broadcast-events 在 "Broadcast Name"
部分默认情况下,Laravel 将使用事件的 class 名称广播事件。但是,您可以通过在事件上定义 broadcastAs 方法来自定义广播名称:
/**
* The event's broadcast name.
*
* @return string
*/
public function broadcastAs()
{
return 'server.created';
}
如果您使用 broadcastAs 方法自定义广播名称,您应该确保使用前导 .特点。这将指示 Echo 不要将应用程序的命名空间添加到事件中:
.listen('.server.created', function (e) {
//....
});