Как реализовать клиент laravel-echo в проекте Vue

Я разрабатываю приложение с Vuetify (Vue.js) в качестве интерфейса, которое взаимодействует с api с внутренним сервером ларавел.

Пытаюсь сделать систему уведомлений с laravel-эхо-сервер, работающую с socket.io. И использование laravel-echo в клиенте тоже.

Код, который я использую в компоненте клиента, чтобы проверить, работает ли соединение:

// Needed by laravel-echo
window.io = require('socket.io-client')

let token = this.$store.getters.token

let echo = new Echo({
  broadcaster: 'socket.io',
  host: 'http://localhost:6001',
  auth: {
    headers: {
      authorization: 'Bearer ' + token,
      'X-CSRF-TOKEN': 'too_long_csrf_token_hardcoded'
    }
  }
})

echo.private('Prova').listen('Prova', () => {
  console.info('IT WORKS!')
})

Это код laravel-echo-server.json

{
    "authHost": "http://gac-backend.test",
    "authEndpoint": "/broadcasting/auth",
    "clients": [],
    "database": "redis",
    "databaseConfig": {
        "redis": {},
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": null,
    "port": "6001",
    "protocol": "http",
    "socketio": {},
    "sslCertPath": "",
    "sslKeyPath": "",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "apiOriginAllow": {
        "allowCors": false,
        "allowOrigin": "",
        "allowMethods": "",
        "allowHeaders": ""
    }
}

Я безуспешно пытался изменить apiOriginsAllow. Событие отправлено, я вижу его в журналах laravel-эхо-сервер:

Channel: Prova
Event: App\Events\Prova

Но после этого, когда я обращаюсь к компоненту клиента, содержащему код подключения, я вижу в журналах laravel-echo-server длинную трассировку ошибок и следующую ошибку:

The client cannot be authenticated, got HTTP status 419

Как видите, я указал токен csrf и токен авторизации в заголовках клиента эхо laravel. Но это не работает.

Это код routes/channels.php:

Broadcast::channel('Prova', function ($user) {
    return true;
});

Я хочу только прослушать событие, не важно, является ли оно частным или общедоступным, потому что, когда оно работает, я хочу передать его в сервис-воркер. Тогда, думаю, лучше, если это будет публично.

  • Как я могу использовать эхо-клиент laravel вне проекта laravel?
  • Будет ли проблема, если я сделаю приватное событие и попытаюсь прослушать его в сервис-воркер?

Вы это уже решили? Я также хочу реализовать Echo с настройкой CORS (серверная часть Laravel и приложение Vue Single Page). Но моя разработка даже хуже твоей. Я до сих пор не понимаю, как поймать возвращаемые данные из события. Если я проверю журнал (файл laravel.log), широковещательная передача была успешно отправлена ​​с полезной нагрузкой, но на интерфейсе также были ошибки No 'Access-Control-Allow-Origin' header. Я установил заголовки с токеном на предъявителя, но ошибка все еще появляется

Muhammad Izzuddin Al Fikri 10.09.2018 02:27

Обновите, ошибка уже исчезла, когда я установил CORS в проекте laravel. Теперь основная проблема такая же, как и у вас, как использовать клиент laravel echo вне проекта laravel: D

Muhammad Izzuddin Al Fikri 10.09.2018 04:16

@MuhammadIzzuddinAlFikri Я написал ответ stackoverflow.com/a/52256566/8950695.

axsor 10.09.2018 13:16

419 - это ошибка CSRF, при использовании POST без "_token", установленного в CSRF Laravel. Вы можете поместить исключение в VerifyCSRFToken.php в промежуточном программном обеспечении или изменить свою стратегию аутентификации и использовать API с Passport или JWT.

James Bailey 19.08.2019 14:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
4
8 051
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Здравствуйте, я расскажу вам о том, как настроить VUE с функциональностью Laravel и Echo.

Шаг 1 Сначала установите laravel

composer create-project laravel/laravel your-project-name 5.4.*

ШАГ 2 Установить переменные изменить Broadcastserviceprovider

нам сначала нужно зарегистрировать App\Providers\BroadcastServiceProvider. Откройте config/app.php и раскомментируйте следующую строку в массиве провайдеров.

// App\Providers\BroadcastServiceProvider

Нам нужно сообщить Laravel, что мы используем драйвер Pusher в файле .env:

BROADCAST_DRIVER=pusher

добавить класс толкателя в config / app.php

'Pusher' => Pusher\Pusher::class,

ШАГ 3 Добавьте Pusher в свой проект laravel

composer require pusher/pusher-php-server

ШАГ 4. Добавьте следующее в config / broadcasting.php

'options' => [
          'cluster' => env('PUSHER_CLUSTER'),
          'encrypted' => true,
      ],

ШАГ 5. Установить переменную толкателя

PUSHER_APP_ID=xxxxxx
PUSHER_APP_KEY=xxxxxxxxxxxxxxxxxxxx
PUSHER_APP_SECRET=xxxxxxxxxxxxxxxxxxxx
PUSHER_CLUSTER=xx

ШАГ 6. Установить узел

npm install

ШАГ 7. Установить Pusher js

npm install --save laravel-echo pusher-js 

ШАГ 8. uncommnet Читает

// resources/assets/js/bootstrap.js

import Echo from "laravel-echo"

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'xxxxxxxxxxxxxxxxxxxx',
    cluster: 'eu',
    encrypted: true
});

ШАГ 9. Перед созданием миграции

// app/Providers/AppServiceProvider.php
// remember to use
Illuminate\Support\Facades\Schema;

public function boot()
{
  Schema::defaultStringLength(191);
}

Большое спасибо за ваш шаг за шагом. Но я использую vue в другом проекте и socket.io. На данный момент я решил это с помощью функции channel вместо private в экземпляре echo. (Я использовал private, и он не работал, потому что канал общедоступный).

axsor 25.04.2018 11:50

для сокета io

npm install socket.io --save

Если у вас недействительный заголовок кадра, установите конечную точку аутентификации в bootstrap.js следующим образом

window.Echo = new Echo({ authEndpoint : 'http://project/broadcasting/auth', broadcaster: 'pusher', key: '63882dbaf334b78ff949', cluster: 'ap2', encrypted: true });

Ответ принят как подходящий

Для запуска клиентских слушателей я использовал Vuex. Затем, когда мое приложение запускается, я отправляю действие INIT_CHANNEL_LISTENERS для запуска слушателей.

index.js каналов МОДУЛЬ vuex

import actions from './actions'
import Echo from 'laravel-echo'
import getters from './getters'
import mutations from './mutations'

window.io = require('socket.io-client')

export default {
  state: {
    channel_listening: false,
    echo: new Echo({
      broadcaster: 'socket.io',
      // host: 'http://localhost:6001'
      host: process.env.CHANNEL_URL
    }),
    notifiable_public_channels: [
      {
        channel: 'Notificacio',
        event: 'Notificacio'
      },
      {
        channel: 'EstatRepetidor',
        event: 'BroadcastEstatRepetidor'
      }
    ]
  },
  actions,
  getters,
  mutations
}

actions.js каналов МОДУЛЬ vuex

import * as actions from '../action-types'
import { notifyMe } from '../../helpers'
// import { notifyMe } from '../../helpers'

export default {
  /*
  * S'entent com a notifiable un event que té "títol" i "message" (Per introduir-los a la notificació)
  * */
  /**
   * Inicialitza tots els listeners per als canals. Creat de forma que es pugui ampliar.
   * En cas de voler afegir més canals "Notifiables" s'ha de afegir un registre al state del index.js d'aquest modul.
   * @param context
   */
  [ actions.INIT_CHANNEL_LISTENERS ] (context) {
    console.info('Initializing channel listeners...')
    context.commit('SET_CHANNEL_LISTENING', true)

    context.getters.notifiable_public_channels.forEach(listener => {
      context.dispatch(actions.INIT_PUBLIC_NOTIFIABLE_CHANNEL_LISTENER, listener)
    })
    // }
  },

  /**
   * Inicialitza un event notificable a través d'un canal.
   * Per anar bé hauria de tenir un titol i un missatge.
   * @param context
   * @param listener
   */
  [ actions.INIT_PUBLIC_NOTIFIABLE_CHANNEL_LISTENER ] (context, listener) {
    context.getters.echo.channel(listener.channel).listen(listener.event, payload => {
      notifyMe(payload.message, payload.title)
    })
  }
}

функция notifyMe в помощниках Эта функция отправляет уведомление в браузер.

export function notifyMe (message, titol = 'TITLE', icon = icon) {
  if (!('Notification' in window)) {
    console.error('This browser does not support desktop notification')
  } else if (Notification.permission === 'granted') {
    let notification = new Notification(titol, {
      icon: icon,
      body: message,
      vibrate: [100, 50, 100],
      data: {
        dateOfArrival: Date.now(),
        primaryKey: 1
      }
    })
  }

Затем бэкэнд использует laravel-echo-server, как и вопрос. Использование Redis для постановки событий в очередь и руководитель для запуска laravel-echo-server при запуске сервера.

Я бы использовал тот же технический стек с вашим, бэкэнд с использованием laravel-echo-server для веб-сокета и redis для постановки событий в очередь. Единственный руководитель, которого я не использую. Я пробую ваше решение, но думаю, что теперь знаю виновника своего проекта. Моя проблема в том, что приложение vue не может получить полезную нагрузку события. И я думаю, почему он не получает, потому что на моем echo.connector.channels он все еще пуст, даже действия vuex уже отправлены. Есть какие-нибудь подсказки об этом?

Muhammad Izzuddin Al Fikri 11.09.2018 03:38

Извините, @MuhammadIzzuddinAlFikri, но у меня было много трудностей, чтобы реализовать это. Я надеюсь быть вам полезной, но не могу

axsor 11.09.2018 11:58

Нет проблем, чувак, я бы решил свою проблему :) Спасибо за информацию

Muhammad Izzuddin Al Fikri 12.09.2018 08:48

@MuhammadIzzuddinAlFikri Я столкнулся с той же проблемой, не могли бы вы объяснить, как вы решили свою проблему?

Louwki 10.10.2019 15:03

Где вы указываете токен?

GTHell 18.06.2020 22:03

Спасибо чувак. Искал пример использования laravel-echo в магазинах, и вот, пожалуйста!

nssmart 04.02.2021 21:29

Другие вопросы по теме