Laravel后端实现报告创建后Web桌面推送通知的方案咨询
嘿,这个问题我刚好有实操经验,来给你好好捋捋~
关于Laravel网站实现桌面推送通知的方案
是否需要Pusher/OneSignal这类服务?
得分两种场景来看:
- 如果你的需求比较简单,只需要用户在线打开网站时接收实时通知,那Laravel自带的Broadcasting配合Pusher(或者开源替代方案比如Laravel Echo Server、Socket.io)就完全够用,不需要额外的OneSignal这类跨平台推送服务。
- 如果需要用户离线时也能收到桌面推送,或者想同时覆盖网页、APP甚至邮件等多渠道,那OneSignal、Firebase Cloud Messaging(FCM)这类专门的推送服务会更省心——它们已经帮你搞定了离线推送的复杂逻辑,不用自己搭建和维护推送基础设施。
实用示例方案
方案1:Laravel Echo + Pusher 实现实时桌面推送(在线场景)
这个方案适合用户在线时的实时通知,完全贴合Laravel生态,步骤如下:
配置Pusher依赖
先在Laravel项目里安装Pusher的PHP SDK:composer require pusher/pusher-php-server然后在
.env文件里填入Pusher的密钥信息(你需要先在Pusher官网注册账号创建应用):BROADCAST_DRIVER=pusher PUSHER_APP_ID=你的AppID PUSHER_APP_KEY=你的AppKey PUSHER_APP_SECRET=你的AppSecret PUSHER_SCHEME=https PUSHER_APP_CLUSTER=你的集群(比如mt1)创建自定义通知类
生成一个处理报告创建的通知类:php artisan make:notification ReportCreated修改
ReportCreated类,让它实现ShouldBroadcast接口,定义推送的频道和内容:<?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; use Illuminate\Notifications\Messages\BroadcastMessage; use Illuminate\Notifications\Notification; class ReportCreated extends Notification implements ShouldBroadcast { use Queueable; protected $report; public function __construct($report) { $this->report = $report; } public function via($notifiable) { return ['broadcast']; } public function toBroadcast($notifiable) { return new BroadcastMessage([ 'title' => '新报告已生成', 'body' => "用户{$this->report->creator->name}给你创建了一份报告:{$this->report->title}", 'url' => route('reports.show', $this->report->id) ]); } // 指定推送至用户的私有频道 public function broadcastOn() { return ['user.'.$notifiable->id]; } }前端监听推送并显示桌面通知
安装Laravel Echo和Pusher的JS SDK:npm install laravel-echo pusher-js在
resources/js/bootstrap.js里配置Echo:import Echo from 'laravel-echo'; import Pusher from 'pusher-js'; window.Pusher = Pusher; window.Echo = new Echo({ broadcaster: 'pusher', key: import.meta.env.VITE_PUSHER_APP_KEY, cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER, forceTLS: true });然后在前端页面中添加监听逻辑,请求通知权限并展示桌面通知:
// 提前请求桌面通知权限 if (Notification.permission !== 'granted') { Notification.requestPermission(); } // 监听当前用户的私有频道 window.Echo.private(`user.${当前用户ID}`) .notification((notification) => { // 弹出桌面通知 const desktopNotification = new Notification(notification.title, { body: notification.body, icon: '/path/to/your/site-icon.png', data: { url: notification.url } }); // 点击通知跳转到报告详情页 desktopNotification.addEventListener('click', () => { window.open(notification.url, '_blank'); desktopNotification.close(); }); });触发通知
在你创建报告的业务逻辑里,给收件用户发送通知:$recipient = User::find($report->recipient_id); $recipient->notify(new ReportCreated($report));
方案2:OneSignal 实现离线桌面推送(支持离线场景)
如果需要用户离线时也能收到通知,OneSignal是个省心的选择,步骤简化版如下:
集成OneSignal到Laravel
安装OneSignal的Laravel包:composer require onesignal/onesignal-laravel在
.env里配置OneSignal的密钥:ONESIGNAL_APP_ID=你的OneSignal AppID ONESIGNAL_REST_API_KEY=你的OneSignal API密钥前端注册OneSignal
在网站的<head>标签里添加OneSignal的初始化脚本:<script src="https://cdn.onesignal.com/sdks/OneSignalSDK.js" async></script> <script> window.OneSignal = window.OneSignal || []; OneSignal.push(function() { OneSignal.init({ appId: "你的OneSignal AppID", }); // 请求通知权限 OneSignal.Notifications.requestPermission(); // 把用户的OneSignal PlayerID保存到你的用户表(方便后续定向推送) OneSignal.User.pushSubscription.getId().then(playerId => { // 发送AJAX请求把playerId存到当前用户的记录里 fetch('/save-player-id', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ player_id: playerId }) }); }); }); </script>发送离线桌面通知
在创建报告后,调用OneSignal的API给指定用户推送通知:use OneSignal\OneSignal; // 从用户表中取出之前保存的OneSignal PlayerID $playerId = $recipient->onesignal_player_id; OneSignal::sendNotificationToUser( "用户{$report->creator->name}给你创建了一份报告:{$report->title}", $playerId, $url = route('reports.show', $report->id), $data = [], $buttons = [], $schedule = null );
总结
- 在线实时推送:优先选Laravel Echo + Pusher(或开源替代),轻量且完全贴合Laravel生态。
- 离线推送:OneSignal/FCM更合适,不用自己维护复杂的推送服务,还支持多平台覆盖。
内容的提问来源于stack exchange,提问作者Faustas Butkus
相关产品推荐
相关产品推荐

