Laravel - laravel-websockets 开发详解

1.我laravel-websockets 的开发环境

2. 安装服务器端包 beyondcode/laravel-websockets

  • 运行以下命令安装laravel-websockets
bash 复制代码
composer require beyondcode/laravel-websockets
  • 安装完后,发布 Laravel WebSockets 的配置文件
bash 复制代码
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="config"
  • 发布迁移文件
bash 复制代码
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="migrations"
  • 运行迁移以创建数据库表
bash 复制代码
php artisan migrate

若安装失败,试试更新所有第三方库:composer update

3.安装pusher

bash 复制代码
composer require pusher/pusher-php-server

4.配置**.env**文件,根据你自身情况填写。

bash 复制代码
PUSHER_APP_ID=your_app_id
PUSHER_APP_KEY=your_app_key
PUSHER_APP_SECRET=your_app_secret
PUSHER_HOST=127.0.0.1
PUSHER_PORT=6001
PUSHER_SCHEME=http
PUSHER_APP_CLUSTER=mt1

此外,还需将 .env 文件中 ,BROADCAST_DRIVER 的值改为 pusher

bash 复制代码
BROADCAST_DRIVER=pusher

5.开始创建通知事件,运行以下命令

bash 复制代码
php artisan make:event SimpleNoticeMessage

具体代码如下:

bash 复制代码
<?php

namespace App\Events;

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

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

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

    /**
     * 获取事件应广播的频道.
     * 频道应该是 Channel、PrivateChannel 或 PresenceChannel 的实例。 Channel 的实例代表任何用户都可以订阅的公共频道,而 PrivateChannels 和 PresenceChannels 代表需要 频道授权 的私人频道:
     * 我的理解就是需要发送给谁
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel('test');
    }
    /**
     * 事件的广播名称。(事件名称)
     * 可选
     * 如果没定义事件名称,则在客户端监听事件的时候填写的是 类名,即SimpleNoticeMessage
     * 如果定义了 则未 .server.admin.notice,注意最前面有个 .
     * @return string
     */
    public function broadcastAs()
    {
        return 'server.test.notice';
    }
}

6.客户端安装 laravel-echo

bash 复制代码
npm install --save-dev laravel-echo pusher-js
  • 配置 resources\js\bootstrap.js 文件,在创建laravel 文件时有,取消注释就行,代码如下
javascript 复制代码
import Echo from 'laravel-echo';

import Pusher from 'pusher-js';
window.Pusher = Pusher;

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: import.meta.env.VITE_PUSHER_APP_KEY,
    cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER ?? 'mt1',
    wsHost: import.meta.env.VITE_PUSHER_HOST ? import.meta.env.VITE_PUSHER_HOST : `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`,
    wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80,
    wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443,
    forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https',
    enabledTransports: ['ws', 'wss'],
});
  • 页面脚本配置,在 resources\views\index.blade.php 文件 的 head 标签的结尾添加以下代码
javascript 复制代码
@vite('resources/js/app.js')
<script>
   window.onload = function(){
         Echo.channel('test').listen('.server.test.notice', (e) => {
               console.log(e.message);
          });
   }
 </script>

7.发送消息,新建控制器 testCl

php 复制代码
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Events\SimpleNoticeMessage;

class testCl extends Controller{

    public function sendMsg(Request $request){

        SimpleNoticeMessage::dispatch("hello world");

        return "发送成功";
    }
}

8.启动项目,为以下命令各开一个终端运行

  • php artisan serve 启动laravel 项目
  • npm run dev 启动vite
  • php artisan queue:work 启动队列
  • php artisan websockets:serve 启动websockets 服务器

9.结束。

  • 在页面访问 testCl 控制器空的sendMsg 方法,即可。
  • 内部测试,新建一个终端窗口。运行 **php artisan tinker ,**在窗口中 输入 event (new \App\Events\SimpleNoticeMessage('hello world')) ,回车有,即可在前端控制中打印出 hellow world
  • 调试面板,运行: 127.0.0.1:8000/laravel-websockets ,也可查看出的消息
相关推荐
fakaifa5 小时前
点大餐饮独立版系统源码v1.0.3+uniapp前端+搭建教程
小程序·uni-app·php·源码下载·点大餐饮·扫码点单
挨踢攻城15 小时前
华为 | SD-WAN场景丢包类问题定位
网络·华为·php·hcie·hcia·hcip·厦门微思网络
fakaifa19 小时前
【最新版】CRMEB Pro版v3.4系统源码全开源+PC端+uniapp前端+搭建教程
人工智能·小程序·uni-app·php·crmeb·源码下载·crmebpro
lingggggaaaa1 天前
小迪安全v2023学习笔记(六十二讲)—— PHP框架反序列化
笔记·学习·安全·web安全·网络安全·php·反序列化
Q_Q19632884751 天前
python的电影院座位管理可视化数据分析系统
开发语言·spring boot·python·django·flask·node.js·php
Ashlee_code1 天前
香港券商智能櫃台系統技術解決方案——融合跨境清算與AI風控,助力券商把握滬港雙市爆發機遇**
java·科技·金融·重构·架构·系统架构·php
nightunderblackcat1 天前
进阶向:人物关系三元组,解锁人物关系网络的钥匙
开发语言·python·开源·php
向日葵.2 天前
fastdds.ignore_local_endpoints 属性
服务器·网络·php
dog2502 天前
难以超越的 TCP AIMD
网络协议·tcp/ip·php
檀越剑指大厂2 天前
【Linux系列】如何在 Linux 服务器上快速获取公网
linux·服务器·php