You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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生态,步骤如下:

  1. 配置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)
    
  2. 创建自定义通知类
    生成一个处理报告创建的通知类:

    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];
        }
    }
    
  3. 前端监听推送并显示桌面通知
    安装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();
            });
        });
    
  4. 触发通知
    在你创建报告的业务逻辑里,给收件用户发送通知:

    $recipient = User::find($report->recipient_id);
    $recipient->notify(new ReportCreated($report));
    

方案2:OneSignal 实现离线桌面推送(支持离线场景)

如果需要用户离线时也能收到通知,OneSignal是个省心的选择,步骤简化版如下:

  1. 集成OneSignal到Laravel
    安装OneSignal的Laravel包:

    composer require onesignal/onesignal-laravel
    

    在.env里配置OneSignal的密钥:

    ONESIGNAL_APP_ID=你的OneSignal AppID
    ONESIGNAL_REST_API_KEY=你的OneSignal API密钥
    
  2. 前端注册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>
    
  3. 发送离线桌面通知
    在创建报告后,调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:59:18