laravel событие генерирует ошибку в реальном приложении чата - PullRequest
2 голосов
/ 05 февраля 2020

Я работаю над демо-программой для мгновенного чата, и мне удалось отобразить количество вошедших в систему пользователей и показать их имена в списке «Онлайн-пользователи», но проблема в том, что я создал событие laravel для отображения сообщения в режиме реального времени, и здесь я получаю следующее сообщение об ошибке в консоли: Ошибка: синтаксическая ошибка, нераспознанное выражение: # user = 1.

подробности демонстрационного приложения:

laravel: 5.8. * php: ^ 7.1.3 redis & laravel echo & laravel echo serveur

просмотр:

<div class="container">
    <div class="row">

        <div class="col-md-4">
            <h2>Online Users</h2>
            <hr>
            <h5 id="no-online-users">No Online Users</h5>

            <ul class="liste-group" id="online-users">

            </ul>
        </div>
    </div>

    <div class="row">
        <div class="col-md-9 d-flex flex-column" style="height: 80vh">
            <div class="h-100 bg-white mb-4 p-5" id="chat" style="overflow-y: scroll;">

                @foreach($messages as $message)

                     @if(\Auth::user()->id == $message->user_id)
                       <div class="mt-4 w-50 text-white p-3 rounded float-right bg-primary">
                     @else
                       <div class="mt-4 w-50 text-black p-3 rounded float-left bg-warning">
                     @endif

                           <p>{{ $message->body }}</p>
                        </div>

                  <div class="clearfix"></div>
                @endforeach

            </div>


            <form action="" class="d-flex">
                <input type="text" id="chat-text" name="" data-url="{{ route('messages.store') }}" style="margin-right: 10px" class="col-md-9 d-flex flex-column">
                <button class="btn btn-primary col-md-3">Send</button>
            </form>
        </div>  
    </div>

</div>

MessageController:

namespace App\Http\Controllers;
use App\Message;
use Illuminate\Http\Request;

class MessageController extends Controller
{

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }
    //index 
    public function index()
    {
        $messages = Message::all();
        return view('messages.index',compact('messages'));
    }

    // store 
    public function store(Request $request)
    {
        //$message = auth()->user()->messages()->create($request->all());
        //return $request->body;

         $message = new Message();
         $message->user_id = \Auth::user()->id;
         $message->body = $request->body;
         $message->save(); 

         broadcast(new MessageDelivered($message))->toOthers();
    }
}

событие MessageDelivered:

namespace App\Events;

use App\Message;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class MessageDelivered implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $message;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(Message $message)
    {
        $this->message = $message;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel('chat-group');
    }
}

приложение. js

require('./bootstrap');


import Echo from "laravel-echo"

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

window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001'
});



// online users :
let onlineUsersLength = 0;

window.Echo.join('online')
    .here((users) => {

        onlineUsersLength = users.length; 
        console.log(onlineUsersLength);

        let userId = $('meta[name=user-id]').attr('content');
        //console.log(userId);


        users.forEach(function(user){

            if (user.id == userId) { return; }
            $('#no-online-users').css('display','none');
            $('#online-users').append('<li id="user='+user.id+'" class="liste-group-item">'+user.name+'</li>');

        })
        //console.log(users);
    })

    .joining((user) => {
        $('#no-online-users').css('display','none');
        $('#online-users').append('<li id="user='+user.id+'" class="liste-group-item">'+user.name+'</li>');
    })

    .leaving((user) => {
        $('#user='+user.id).css('display','none');
        $('#no-online-users').css('display','yes');
    });


// submit chat text :
$('#chat-text').keypress(function(e){
    //console.log(e.which);
    if(e.which == 13){
        e.preventDefault();
        let body = $(this).val();
        let url = $(this).data('url');
        let data = {
            '_token': $('meta[name=csrf-token]').attr('content'),
             body
        }
        //console.log(body);

        $.ajax({
          url: url,
          method: 'post',
          data: data,
        });
    }
});



window.Echo.channel('chat-group')
    .listen('MessageDelivered', (e) => {
        console.log('message');
    });

проблема:

в первой консоли пользователя (идентификатор пользователя 1 в базе данных) 1

во второй консоли пользователя (идентификатор пользователя 2 в базе данных) 2 Когда я обновляю sh страницу для указанного пользователя c, появляется ошибка для второго пользователя

1 Ответ

1 голос
/ 05 февраля 2020

Полагаю, у вас есть опечатка здесь $('#user='+user.id).css('display','none')

                                ^^^

и здесь $('#online-users').append('li id="user='+user.id+'" class="liste-group-item">'+user.name+'</li>'); ^^^

Вы можете исправить это

//...
users.forEach(function(user){

            if (user.id == userId) { return; }
            $('#no-online-users').css('display','none');
            $('#online-users').append('<li id="user-'+user.id+'" class="liste-group-item">'+user.name+'</li>');

})

//...
.joining((user) => {
        $('#no-online-users').css('display','none');
        $('#online-users').append('<li id="user='+user.id+'" class="liste-group-item">'+user.name+'</li>');
})
.leaving((user) => {
            $('#user-'+user.id).css('display','none');
            $('#no-online-users').css('display','yes');
});
//...
...