加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – 使用Laravel的实时用户消息

发布时间:2020-12-14 19:37:52 所属栏目:大数据 来源:网络整理
导读:我真的需要一些帮助,以及这个问题的例子.我需要在我的网站上建立一个会话系统,如Facebook(向对话发送消息并加载消息而不刷新页面).我认为有很多方法可以解决这个问题:广播,长轮询或简单的 AJAX.如果我能有一个使用广播的例子,我将不胜感激.以下是我试图实现
我真的需要一些帮助,以及这个问题的例子.我需要在我的网站上建立一个会话系统,如Facebook(向对话发送消息并加载消息而不刷新页面).我认为有很多方法可以解决这个问题:广播,长轮询或简单的 AJAX.如果我能有一个使用广播的例子,我将不胜感激.以下是我试图实现这一点的方法.

表格对话

Schema::create('conversations',function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_one')->unsigned()->index()->comment('Sender ID');
        $table->foreign('user_one')->references('id')->on('users')->onDelete('cascade');
        $table->integer('user_two')->unsigned()->index()->comment('Inrerlocutor's ID');
        $table->foreign('user_two')->references('id')->on('users')->onDelete('cascade');
        $table->timestamps();
    });

表消息

Schema::create('messages',function (Blueprint $table) {
            $table->increments('id');
            $table->text('message')->comment('Message text');
            $table->boolean('is_seen')->default(0);
            $table->boolean('deleted_from_sender')->default(0);
            $table->boolean('deleted_from_receiver')->default(0);
            $table->integer('user_id')->unsigned()->index()->comment('Sender ID');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->integer('conversation_id')->unsigned()->index()->comment('Conversation ID');
            $table->foreign('conversation_id')->references('id')->on('conversations')->onDelete('cascade');
            $table->timestamps();
        });

调节器

public function sendMessage($id,SendMessageRequest $request)
{
    if ($id == Auth::id())
    {
        return redirect('/');
    }

    $conversation = Conversation::whereIn('user_one',[Auth::id(),$id])
        ->whereIn('user_two',[$id,Auth::id()])
        ->first(); // Get conversation data

    /**
     * Create a new conv. when doesnt exists
     */
    if ($conversation == NULL)
    {
        $newConversation = Conversation::create([
            'user_one' => Auth::id(),'user_two' => $id,]);
    }

    /**
     * Create message
     */
    Message::create([
        'message' => $request->get('message'),'user_id' => Auth::id(),'conversation_id' => $conversation !== NULL ? $conversation->id : $newConversation->id,]);

    return redirect(route('mails.chat',$id));
}

/**
 * Chat History
 */
public function chat($id)
{
    $user = User::find($id); // Get user data
    $title = 'Диалог с ' . $user->name . ' ' . $user->lastname; // Page title

    if ($id == Auth::id())
    {
        return redirect('/');
    }

    $conversation = Conversation::whereIn('user_one',Auth::id()])
        ->first(); // Get conv. data

    $messages = '';
    if ($conversation !== NULL)
    {
        $messages = Message::where('conversation_id',$conversation->id)->paginate(30); // Get messages
    }

    return view('mails.chat',[
        'title' => $title,'conversation' => $conversation,'messages' => $messages,'user' => $user,]);
}

模型对话

class Conversation extends Model
{
    protected $table = 'conversations';
    protected $fillable = ['user_one','user_two'];
    protected $dates = ['created_at','updated_at'];

    public function user() {
        return $this->belongsToMany('AppUser');
    }
}

模型消息

class Message extends Model
{
    protected $table = 'messages';
    protected $fillable = ['message','is_seen','deleted_from_sender','deleted_from_receiver','user_id','conversation_id'];
    protected $dates = ['created_at','updated_at'];

    public function user() {
        return $this->belongsToMany('AppUser');
    }

    public function conversation() {
        return $this->belongsToMany('AppConversation');
    }
}

视图

@extends('layouts.app')

@section('content')

{{-- Simple display messages --}}
@if ($conversation !== NULL && count($messages) !== 0)
    @foreach($messages as $message)
        @php($sender = AppUser::find($message->user_id))

        <div>
            <b>{{ $sender->name }} {{ $sender->lastname }}</b><br>
            {{ $message->message }}
        </div>
    @endforeach
@else
    <div class="alert alert-info">No messages.</div>
@endif

<form id="submit" method="post" action="{{ route('mails.sendMessage',$user->id) }}">
    {{ csrf_field() }}
    <b>Message:</b><br>
    <textarea name="message"></textarea>

    <button type="submit">Send!</button>
</form>

@endsection

谢谢你帮我这个.

解决方法

你要找的是 Laravel Echo.这适用于redis服务器,socket.io和 laravel echo server.它非常好用且易于设置.查看示例应用程序 here

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读