如何将laravel-echo客户端实现到Vue项目中
How to implement laravel-echo client into Vue project
我正在使用 Vuetify (Vue.js) 作为 front-end 开发一个应用程序,它与 api 通信到 laravel 后端服务器。
我正在尝试使用 laravel-echo-server 和 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.log('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-echo-server 日志中看到它:
Channel: Prova
Event: App\Events\Prova
但在那之后,当我访问包含连接代码的客户端组件时,我可以在 laravel-echo-server 日志中看到长错误跟踪和下一个错误:
The client cannot be authenticated, got HTTP status 419
如您所见,我在 laravel echo 客户端的 headers 中指定了 csrf 令牌和授权令牌。但是没用。
这是routes/channels.php
的代码:
Broadcast::channel('Prova', function ($user) {
return true;
});
我只想听一个事件,它是私有的还是私有的并不重要public因为当它起作用时,我想把它放到服务工作者中。然后,我想如果是 public.
会更好
- 如何在 laravel 项目中使用 laravel echo 客户端?
- 如果我制作私人活动并尝试将其收听给 service worker 会有问题吗?
您好,我将向您介绍如何使用 Laravel 和 Echo 功能配置 VUE 的整个步骤
Step1先安装laravel
composer create-project laravel/laravel your-project-name 5.4.*
第 2 步 设置变量更改 Broadcastserviceprovider
我们首先需要注册App\Providers\BroadcastServiceProvider
。打开 config/app.php
并取消注释 providers 数组中的以下行。
// App\Providers\BroadcastServiceProvider
我们需要告诉Laravel我们正在使用 .env 文件中的 Pusher 驱动程序:
BROADCAST_DRIVER=pusher
在config/app中添加推送器Class。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 步取消关注
// 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);
}
对于套接字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 个通道 MODULE 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 个通道 MODULE 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.log('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 对事件进行排队,并使用 supervisor 在服务器启动时启动 laravel-echo-server。
我正在使用 Vuetify (Vue.js) 作为 front-end 开发一个应用程序,它与 api 通信到 laravel 后端服务器。
我正在尝试使用 laravel-echo-server 和 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.log('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-echo-server 日志中看到它:
Channel: Prova
Event: App\Events\Prova
但在那之后,当我访问包含连接代码的客户端组件时,我可以在 laravel-echo-server 日志中看到长错误跟踪和下一个错误:
The client cannot be authenticated, got HTTP status 419
如您所见,我在 laravel echo 客户端的 headers 中指定了 csrf 令牌和授权令牌。但是没用。
这是routes/channels.php
的代码:
Broadcast::channel('Prova', function ($user) {
return true;
});
我只想听一个事件,它是私有的还是私有的并不重要public因为当它起作用时,我想把它放到服务工作者中。然后,我想如果是 public.
会更好- 如何在 laravel 项目中使用 laravel echo 客户端?
- 如果我制作私人活动并尝试将其收听给 service worker 会有问题吗?
您好,我将向您介绍如何使用 Laravel 和 Echo 功能配置 VUE 的整个步骤
Step1先安装laravel
composer create-project laravel/laravel your-project-name 5.4.*
第 2 步 设置变量更改 Broadcastserviceprovider
我们首先需要注册App\Providers\BroadcastServiceProvider
。打开 config/app.php
并取消注释 providers 数组中的以下行。
// App\Providers\BroadcastServiceProvider
我们需要告诉Laravel我们正在使用 .env 文件中的 Pusher 驱动程序:
BROADCAST_DRIVER=pusher
在config/app中添加推送器Class。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 步取消关注
// 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);
}
对于套接字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 个通道 MODULE 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 个通道 MODULE 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.log('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 对事件进行排队,并使用 supervisor 在服务器启动时启动 laravel-echo-server。