Привязать уведомления в реальном времени в Laravel Blade как предупреждение

В моем веб-приложении я хочу уведомить некоторых конкретных пользователей, когда какая-либо задача создается от администратора. Это должно быть в реальном времени. Поэтому я использовал толкатель 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

Консоль отладки 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>

Конфиг/broadcasting.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. Как это возможно? Пожалуйста, предложите решение для фронтенда.


person Anushka Deshan    schedule 05.05.2020    source источник


Ответы (1)


Вам нужно использовать черту 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

person Uzair Riaz    schedule 05.05.2020
comment
Привет. Я добавил черту Notifiable в пользовательскую модель и функцию receivesBroadcastNotificationsOn в пользовательскую модель. А также поместил Laravel Echo во внешний интерфейс. Но в консоли. Я ничего не понимаю. Пусто. - person Anushka Deshan; 06.05.2020
comment
Вы установили laravel echo и настроили его? что используете для трансляции из бэкенда? Попробуйте запустить php artisan queue:work. Также откройте консоль и проверьте наличие ошибок. Эхо Laravel выдаст несколько ошибок, если соединение не удалось. - person Uzair Riaz; 06.05.2020
comment
Я его установил и настроил. Как проверить, правильно ли я установил Echo? А также проверил ошибки. В консоли ошибок нет. Я обновил свой boostrap.js и интерфейс в вопросе. Пожалуйста, обратитесь к нему также - person Anushka Deshan; 06.05.2020
comment
Хорошо, кажется, вы правильно настроили его. Следующим шагом будет проверка того, что вы используете для серверной трансляции. Я знаю два самых популярных: Pusher и Laravel-Websockets. Для трансляции laravel-websockets вам нужно выполнить php artisan websockets:serve и php artisan queue:work в двух разных терминалах. - person Uzair Riaz; 06.05.2020
comment
Привет, я использую Pusher в качестве внутреннего вещания. В консоли отладки толкателя. событие успешно работает как прикрепленные изображения в моем вопросе - person Anushka Deshan; 06.05.2020
comment
Кроме того, мой плохой. Поскольку вы добавили receivesBroadcastNotificationsOn в свою модель, вы должны слушать Echo.private('users.' + userId) .notification((notification) => { console.log(notification.type); }); - person Uzair Riaz; 06.05.2020
comment
Добавляю к вопросу. Пожалуйста, обратитесь - person Anushka Deshan; 06.05.2020
comment
Я предполагаю, что вы пытаетесь это сделать на производстве с forceTLS: true для эха laravel? Также зафиксируйте эхо-канал на 'users.' + userId. - person Uzair Riaz; 06.05.2020
comment
Давайте продолжим обсуждение в чате. - person Uzair Riaz; 06.05.2020
comment
Что, если я удалю forceTLS:true. также попытался исправить канал на 'users.' + userId. Но ничего не изменилось. - person Anushka Deshan; 06.05.2020
comment
не могли бы вы присоединиться к чату, если это не проблема? Я могу помочь вам лучше там. chat.stackoverflow.com/rooms/213215/ - person Uzair Riaz; 06.05.2020
comment
Наконец-то это сделано, братан. В Routes/Channels.php меняет его на Broadcast::channel('users.{id}', function ($user, $id) { return (int) $user->id === (int) $id; }); . - person Anushka Deshan; 06.05.2020
comment
правильно, для частных каналов требуется аутентификация. Рад, что вы смогли ее решить! - person Uzair Riaz; 06.05.2020
comment
Братан. Есть ли у нас способ работать с несколькими частными каналами в приведенном выше примере? - person Anushka Deshan; 10.05.2020
comment
давайте поговорим на join.slack.com/t/vue-vmr4432 /shared_invite/. так что я могу понять, что вы пытаетесь сделать лучше. - person Uzair Riaz; 10.05.2020