Я разрабатываю приложение с 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;
});
Я хочу только прослушать событие, не важно, является ли оно частным или общедоступным, потому что, когда оно работает, я хочу передать его в сервис-воркер. Тогда, думаю, лучше, если это будет публично.
Обновите, ошибка уже исчезла, когда я установил CORS в проекте laravel. Теперь основная проблема такая же, как и у вас, как использовать клиент laravel echo вне проекта laravel: D
@MuhammadIzzuddinAlFikri Я написал ответ stackoverflow.com/a/52256566/8950695.
419 - это ошибка CSRF, при использовании POST без "_token", установленного в CSRF Laravel. Вы можете поместить исключение в VerifyCSRFToken.php в промежуточном программном обеспечении или изменить свою стратегию аутентификации и использовать API с Passport или JWT.






Здравствуйте, я расскажу вам о том, как настроить 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, и он не работал, потому что канал общедоступный).
для сокета 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 уже отправлены. Есть какие-нибудь подсказки об этом?
Извините, @MuhammadIzzuddinAlFikri, но у меня было много трудностей, чтобы реализовать это. Я надеюсь быть вам полезной, но не могу
Нет проблем, чувак, я бы решил свою проблему :) Спасибо за информацию
@MuhammadIzzuddinAlFikri Я столкнулся с той же проблемой, не могли бы вы объяснить, как вы решили свою проблему?
Где вы указываете токен?
Спасибо чувак. Искал пример использования laravel-echo в магазинах, и вот, пожалуйста!
Вы это уже решили? Я также хочу реализовать Echo с настройкой CORS (серверная часть Laravel и приложение Vue Single Page). Но моя разработка даже хуже твоей. Я до сих пор не понимаю, как поймать возвращаемые данные из события. Если я проверю журнал (файл laravel.log), широковещательная передача была успешно отправлена с полезной нагрузкой, но на интерфейсе также были ошибки
No 'Access-Control-Allow-Origin' header. Я установил заголовки с токеном на предъявителя, но ошибка все еще появляется