从 0 开始打造聊天室,搞定 Laravel 实时通信 —— 配置与绑定

从 0 开始打造聊天室,搞定 Laravel 实时通信 —— 配置与绑定

数据绑定

打开 routes/web.php,注册话题路由

Route::get('/topics', [\App\Http\Controllers\TopicController::class, 'index']);
Route::get('/topics/{topic}', [\App\Http\Controllers\TopicController::class, 'show']);

打开 TopicController

public function show(Topic $topic)
{
    $topic->load('discussions'); // 加载 discussions 模型关系
    return view('topics.show', compact('topic'));
}

创建 blade 模板

我们要将 topics.show 路由返回的 topics 传递到 Topic.vue 组件。

新建文件

touch resources/topics/show.blade.php

向 VUE 组件传递数据

@extends('layouts.app')
@section('content')
  <topic :topic="{{  $topic }}"></topic> // 为组件定义 topic 属性
@endsection

创建前端组件

删除 resources/js/components/ExampleComponent.js

新建 Topic.vue 前端 JS 文件。

<template>
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-md-8">
                <h3>{{topic.name}}</h3>
                <div v-for="discussion in this.discussions">
                    <h4> {{ discussion.user.name }} </h4>
                    <p>{{ discussion.body }}</p>
                </div>
                <hr>
                // 绑定 create() 函数,提交表单时触发
                <form action="#" @submit.prevent="create">
                    <textarea name="30" cols="10" rows="5" v-model="talking" class="form-control"></textarea>
                    <button type="submit" class="btn btn-danger float-end mt-2">发布</button>
                </form>
            </div>
        </div>
    </div>
</template>

<script>
    export default {
        props: ['topic'],
        data(){
            return {
                discussions : this.topic.discussions,
                talking : '',
            }
        },
        methods : {
            create(){
                console.log(this.talking)
                this.talking = ''  // 每次触发 create 之后,清空文本框输入的值
            }
        }
    }
</script>

注册组件 resources/js/app.js

Vue.component('topic', require('./components/Topic.vue').default);

代码量有点多,请仔细阅读注释。

现在打开 your-project/topics/1 应该可以看到数据了

从 0 开始打造聊天室,搞定 Laravel 实时通信 —— 数据绑定


配置实时通信

我们前面的准备工作已经做好了,现在来为我们的项目添加实时通讯的功能

首先打开 .env,我们来配置一下 pusher

...  
DB_PASSWORD=
BROADCAST_DRIVER=pusher // 广播驱动改为 Pusher

PUSHER_APP_ID=123123
PUSHER_APP_KEY=321321
PUSHER_APP_SECRET=secret
PUSHER_APP_CLUSTER=mt1

随意填写即可,Laravel 框架默认集成了 Pusher 三方服务,我们要使用 Laravel-websocket 把 Pusher 的三方服务转发到我们本地的服务器来处理。

安装 composer 组件

打开 composer.json

"require": {
        ...
        "guzzlehttp/psr7": "^1.5",
        "beyondcode/laravel-websockets": "^1.12.0",
        "pusher/pusher-php-server": "~3.0"
    },

执行

composer update

发布 laravel-websockets

php artisan vendor:publish 

在列表里选择 BeyondCode\LaravelWebSockets\WebSocketsServiceProvider 对应的序号。

一起来实现单用户登录3

配置 Websocket

关于 websockets 的配置,可以在 config/websockets.php 里找到
官方文档:点击这里
你只需要知道它在哪里即可,我们没有需要定制的配置。

然后打开 config/broadcasting.php,修改 pusher 发送的请求地址为我们本地 ip 地址。

'connections' => [ 
        'pusher' => [
            ...
            'options' => [
                'cluster' => env('PUSHER_APP_CLUSTER'),
                'encrypted' => true,
                'host' => '127.0.0.1',
                'port' => 6001,
                'scheme' => 'http'
            ],
        ],

好了,组件安装完成,执行命令启动 websocket 服务

php artisan migrate // 先执行迁移
php artisan websockets:serve

打开 your-project/laravel-websockets 可以看到控制台,点击 Connect 可以看到所有的发送消息明细。

从 0 开始打造聊天室,搞定 Laravel 实时通信 —— 发布消息

配置 Laravel-echo

打开 resources/js/bootstrap.js

import Echo from 'laravel-echo';

window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    cluster: process.env.MIX_PUSHER_APP_CLUSTER,
    wsHost: window.location.hostname,
    wsPort: 6001, // 保证与 Laravel-websocket 的监听端口一致
    forceTLS: false,
    disableStats: true,
});

到此就差不多了,下一节我们来开始实现发送实时消息。

本作品采用《CC 协议》,转载必须注明作者和本文链接
悲观者永远正确,乐观者永远前行。
本帖由系统于 1年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 8

感谢!最近正好在找实时聊天解决方案

2年前 评论

666! file

2年前 评论
MArtian (楼主) 2年前
她来听我的演唱会 (作者) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!