将 Laravel Blade 中的实时通知绑定为警报

Posted

技术标签:

【中文标题】将 Laravel Blade 中的实时通知绑定为警报【英文标题】:Bind Real Time Notifications in Laravel Blade as alert 【发布时间】:2020-05-05 09:56:54 【问题描述】:

在我的网络应用程序中,我想在从管理员创建某些任务时通知某些特定用户。这应该是实时的。因此我使用了 laravel 推送器。但这没有任何意义。我想解决这个问题。

我的控制器:

        public function add(Request $request)
            $data = $request->all();
            $tasks = Todo::create($data);

            //send notofications 
            $notifyTo = User::whereHas('roles', function($q)$q->whereIn('slug', [ 'manager'   ]);)->get();
            foreach ($notifyTo as $notifyUser) 
                $notifyUser->notify(new TaskCreated($tasks));
            
        

我的 TaskCreated 通知类

public function via($notifiable)
   
      return ['broadcast'];
   

public function toBroadcast($notifiable)

    return [
        'title' => $this->tasks->task
    ];

我的 Pusher 调试控制台

这是我的 boostrap.js

/**
 * Echo exposes an expressive API for subscribing to channels and listening
 * for events that are broadcast by Laravel. Echo and event broadcasting
 * allows your team to easily build robust real-time web applications.
 */

import Echo from 'laravel-echo'

window.Pusher = require('pusher-js');

window.Echo = new Echo(
    broadcaster: 'pusher',
    key:'bf6e79cce8gfggf548fb2c5e9',
    cluster: 'ap2',
    forceTLS: true
);

这是我的前端

<script>
  var userId = $('meta[name="userId"]').attr('content');
    Echo.private('App.User.' + userId)
    .notification((notification) => 
        console.log(notification.type);
    );

  </script>

配置/广播.php

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Default Broadcaster
    |--------------------------------------------------------------------------
    |
    | This option controls the default broadcaster that will be used by the
    | framework when an event needs to be broadcast. You may set this to
    | any of the connections defined in the "connections" array below.
    |
    | Supported: "pusher", "redis", "log", "null"
    |
    */

    'default' => env('BROADCAST_DRIVER', 'null'),

    /*
    |--------------------------------------------------------------------------
    | Broadcast Connections
    |--------------------------------------------------------------------------
    |
    | Here you may define all of the broadcast connections that will be used
    | to broadcast events to other systems or over websockets. Samples of
    | each available type of connection are provided inside this array.
    |
    */

    'connections' => [

        'pusher' => [
            'driver' => 'pusher',
            'key' => env('PUSHER_APP_KEY'),
            'secret' => env('PUSHER_APP_SECRET'),
            'app_id' => env('PUSHER_APP_ID'),
            //'options' => [
                //'cluster' => env('PUSHER_APP_CLUSTER'),
                //'encrypted' => true,
               // 'host' => '127.0.0.1',
               // 'port' => 6004,
               // 'scheme' => 'http'
            //],

            'options' => [
                'cluster' => 'ap2',
                'useTLS' => true
            ],
        ],

        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
        ],

        'log' => [
            'driver' => 'log',
        ],

        'null' => [
            'driver' => 'null',
        ],

    ],

];

我想在我的 laravel 网络应用中提醒通知标题。怎么可能?请提出前端解决方案。

【问题讨论】:

【参考方案1】:

您需要在 User 模型中使用 Notifiable 特征。之后,您需要指定广播将使用的频道。为了使其独一无二,请将 user_id 附加到常量 channel_name 的末尾,如下所示:

class User extends Authenticatable

    use Notifiable;

    /**
     * The channels the user receives notification broadcasts on.
     *
     * @return string
     */
    public function receivesBroadcastNotificationsOn()
    
        return 'users.'.$this->id;
    

在前端,您需要使用一个名为Laravel Echo 的包。您可以使用 Laravel Echo 在前端收听广播,如下所示:

Echo.private('users.' + userId)
    .notification((notification) => 
        console.log(notification.type);
    );

参考文档:https://laravel.com/docs/7.x/notifications#listening-for-notifications

【讨论】:

嗨。我将Notifiable 特征添加到用户模型,将receivesBroadcastNotificationsOn 函数添加到用户模型。还将Laravel Echo 也放在前端。但是在控制台中。我什么也得不到。它是空的。 你安装 laravel echo 并配置了吗?什么用于从后端广播?尝试运行php artisan queue:work。同时打开您的控制台并检查是否有任何错误。如果连接不成功,Laravel echo 会抛出一些错误。 我确实安装并配置了它。如果我正确安装了 Echo,如何验证它?并且还检查了错误。控制台中没有任何错误。我更新了我的boostrap.js 和问题的前端。也请参考 好的,看来您配置正确。下一步是检查您用于后端广播的内容。我知道两个流行的,Pusher 和 Laravel-Websockets。要让 laravel-websockets 广播,您必须在两个不同的终端中执行 php artisan websockets:servephp artisan queue:work 您好,我正在使用 Pusher 作为后端广播。在推送器调试控制台中。事件在我的问题中作为附加图片成功运行

以上是关于将 Laravel Blade 中的实时通知绑定为警报的主要内容,如果未能解决你的问题,请参考以下文章

Laravel/Blade,内容中的模板内容

在 Laravel Blade 中转义 VueJS 数据绑定语法?

Blade 视图组件的 Laravel 路由模型绑定

在 Laravel 8 Jetstream 的 Blade 组件中绑定 Livewire 属性

Laravel 中的 Blade 模板与普通 php

将 Laravel 路由中的数组传递给 Blade 模板