Я сделал проект с Laravel и реагирую. Для видеочата определен компонент реакции. Видео работает, но у меня возникают проблемы с присутствием_auth (), в основном я получаю сообщение об ошибке с ответом 500 ()
Call to undefined method Pusher\Pusher::presence_auth()
Ниже приведен файл моих веб-маршрутов:
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
Route::post('/pusher/auth', 'HomeController@authenticate');
HomeController, где я получаю эту ошибку:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use \Pusher\Pusher;
class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('home');
}
public function authenticate(Request $request){
$socketId = $request->socket_id;
$channelName = $request->channel_name;
$pusher = new Pusher('7525d88e2baa6d08b175', 'c25081ca96b9033e941c', '523589', [
'cluster' => 'ap1',
'encrypted' => true
]);
$presence_data = ['name' => auth()->user()->name];
$key = $pusher->presence_auth($channelName, $socketId, auth()->id(), $presence_data);
return response($key);
}
}
И, наконец, мой файл App.js с компонентами:
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import MediaHandler from '../MediaHandler';
import Pusher from 'pusher-js';
import Peer from 'simple-peer';
const APP_KEY = '7525d88e2baa6d08b175';
export default class App extends Component {
constructor(){
super();
this.state = {
hasMedia: false,
otherUserId: null
};
this.user = window.user;
this.user.stream = null;
this.peers = {};
this.mediaHandler = new MediaHandler();
this.setupPusher();
this.callTo = this.callTo.bind(this);
this.setupPusher = this.setupPusher.bind(this);
this.startPeer = this.startPeer.bind(this);
}
componentWillMount(){
this.mediaHandler.getPermissions()
.then((stream) => {
this.setState({hasMedia: true});
this.user.stream = stream;
try{
this.myVideo.srcObject = stream;
} catch(e) {
this.myVideo.src = URL.createObjectURL(stream);
}
this.myVideo.play();
})
}
setupPusher(){
this.pusher = new Pusher(APP_KEY, {
authEndpoint: '/pusher/auth',
cluster: 'ap1',
auth: {
params: this.user.id,
headers: {
'X-CSRF-Token': window.csrfToken
}
}
});
this.channel = this.pusher.subscribe('presence-video-channel');
this.channel.bind(`client-signal-${this.user.id}`, (signal) => {
let peer = this.peers[signal.userId];
if (peer == undefined){
this.setState({otherUserId: signal.userId});
peer = this.startPeer(signal.userId, false);
}
peer.signal(signal.data);
});
}
startPeer(userId, initiator = true){
const peer = new Peer({
initiator,
stream: this.user.stream,
trickle: false
});
peer.on('signal', (data) => {
this.channel.trigger(`client-signal-${userId}`, {
type: 'signal',
userId: this.user.id,
data: data
});
});
peer.on('stream', (stream) => {
try{
this.userVideo.srcObject = stream;
} catch(e) {
this.userVideo.src = URL.createObjectURL(stream);
}
this.userVideo.play();
});
peer.on('close', () => {
let peer = this.peers[userId];
if (peer != undefined){
peer.destroy();
}
this.peers[userId] = undefined;
});
return peer;
}
callTo(userId){
this.peers[userId] = this.startPeer(userId);
}
render() {
return (
<div className = "App">
{[1,2,3,4].map((userId) => {
return this.user.id != userId ? <button key = {userId} onClick = {() => this.callTo(userId)}>Call {userId}</button> : null
})}
<div className = "video-container">
<video className = "my-video" ref = {(ref) => {this.myVideo = ref;}}></video>
<video className = "user-video" ref = {(ref) => {this.userVideo = ref;}}></video>
</div>
</div>
);
}
}
if (document.getElementById('app')) {
ReactDOM.render(<App />, document.getElementById('app'));
}
Все остальное работает нормально в потоке, но по какой-то причине функция присутствует_auth () не идентифицируется.
Я использую версию 3.0.3
@WillSewell ... ты можешь мне с этим помочь. Я гоняюсь за этим почти три дня. Был бы очень признателен за любую помощь. В прошлую субботу я уже открывал тикет: запрос № 13505, но все еще жду его разрешения.
Несколько вещей, которые помогли бы мне в этом разобраться: можете ли вы вызвать var_dump и get_class_methods на $pusher и распечатать результат? Еще лучше: не могли бы вы заархивировать весь свой проект и отправить его мне, чтобы я попытался воспроизвести проблему?
Конечно ... делать это сейчас, куда мне его отправить?
@WillSewell ... Я заархивировал проект, удалил папку node_modules, поэтому вам понадобится обновление композитора npm install. Посоветуйте, пожалуйста, куда мне его отправить.
Вы можете использовать службу загрузки файлов, например uploadfiles.io
Отлично ... вот ссылка: ufile.io/u0ltz Я очень надеюсь, что вы, ребята, можете помочь
Проблема в том, что вы фактически используете эта версияpusher-php-server. Этого нет даже в главной ветви (new-lib), и он не включает метод presence_auth. Вы можете использовать метод authenticate или обновить версию в файле composer.lock до master.
Спасибо ... Я этого не заметил. Обновление проекта и тестирование с изменениями сейчас.






Итак, у меня была такая же проблема, и я смог ее решить. мой клиент pusher php был pusher / pusher-php-server "~ 3.0". В этой версии библиотеки метод присутствия_auth () недоступен. Мне пришлось использовать последнюю версию библиотеки 5, и она работала без каких-либо дополнительных изменений. Я просто обновляю до последней версии.
Какую версию
pusher-php-serverвы используете?