Laravel11 从0开发 Swoole-Reverb 扩展包(一) - 扩展包开发
前言
大家好呀,我是yangyang。好久没更新了,最近新项目在使用laravel11(截止目前发文,laravel12也发布了)做开发,自己也是利用有些空闲时间做些除开业务以外的深入学习,因此也就萌生了做一个系列随笔文章的想法。
laravel11
Laravel 11 继续改进 Laravel 10.x,通过引入简化的应用程序结构、每秒速率限制、健康路由、优雅的加密密钥轮换、队列测试改进、Resend 邮件传输、Prompt 验证器集成、新的 Artisan 命令等。此外,Laravel Reverb,一个官方的可扩展 WebSocket 服务器也被引入,为您的应用程序提供强大的实时功能。
————————————————
开篇
laravel Reverb
Laravel Reverb 由 Joe Dixon 开发。Laravel Reverb 为 Laravel 应用程序带来了极速且可扩展的实时 WebSocket 通信,并与 Laravel 现有的事件广播工具(如 Laravel Echo)无缝集成。此外,Reverb 支持通过 Redis 的发布 / 订阅功能进行水平扩展,使您能够将 WebSocket 流量分布在多个后端 Reverb 服务器上,从而支持单个高需求应用程序。
有关 Laravel Reverb 的更多信息,请查阅完整的 Reverb 文档。
开发原由
24年出了一些关于Reverb混响的一些随笔,最近也简单跟踪了下它的源码,laravel无愧于设计大神,Joe Dixon 大佬的封装设计实现非常到位,以至于云里雾里的。Reverb在ws+http混合服务使用的react-php实现,想着国内(个人认知,不代表所有)用它不多,多是swoole、workerman。于是就想到了用swoole来复刻一个版本,一开始,准备基于Reverb来扩展swoole并支持替换react-php。发现代码设计关联很多,我个人难以撼动,于是另辟蹊径,做一个新的扩展包。
因此,在本系列文章中,我将分享如何从零开始为 Laravel11 开发一个自定义扩展包——Swoole-Reverb,目前这个扩展包我也抽空开发,在开发过程中,我遇到了一些问题,如果我觉得有用,我会第一时间总结一些方案,希望能为大家提供一些参考和帮助。最后,也希望能够像到Joe Dixon大神的水准看齐。
一、项目结构和初始设置
首先,我们在 Laravel 应用的同级目录下创建了一个 core 目录,并在其中放置 Swoole-Reverb 扩展包的代码。基本的目录结构如下:
project-root/
├── app/
├── core/
│   └── SwooleReverb/
│       └── src/
│           ├── Providers/
│           │   ├── BroadcastServiceProvider.php
│           │   └── SwooleReverbServiceProvider.php
│           └── Broadcasting/
│               └── SwooleBroadcaster.php
└── composer.json
在主项目的 composer.json 文件中,我们通过 autoload 配置引入了 Swoole-Reverb 的命名空间:
"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Database\\Factories\\": "database/factories/",
        "Database\\Seeders\\": "database/seeders/",
        "SwooleReverb\\": "core/SwooleReverb/src/"
    }
}
同时,在 extra 部分配置了 Laravel 的自动发现信息:
"extra": {
    "laravel": {
        "providers": [
            "SwooleReverb\\Providers\\BroadcastServiceProvider",
            "SwooleReverb\\Providers\\SwooleReverbServiceProvider"
        ]
    }
}
目前考虑到开发方便,一开始的操作是这样的,后期在做独立包。
注意:自动发现机制只针对通过 Composer 安装到 vendor 目录中的包生效。如果你把包直接放在项目根目录外(比如
core目录下),Laravel 不会自动发现这些包。解决办法可以是通过 本地路径仓库 将包安装进 vendor 中,或者直接手动注册服务提供者。
二、自动发现问题和手动注册
但是按照我上面的方式,在开发过程中,我发现执行 php artisan vendor:publish 无法找到 Swoole-Reverb 的服务提供者。经过排查,主要原因是 Laravel 自动发现机制不支持直接放在项目根目录的扩展包。
解决方案
- 本地路径仓库方式
 在主项目的composer.json中添加如下配置,将 repositories 改为数组形式并追加本地路径仓库:"repositories": [
 {
 "type": "composer",
 "url": "https://packagist.org"
 },
 {
 "type": "path",
 "url": "core/SwooleReverb"
 }
 ]
 然后在 core/SwooleReverb下的composer.json中配置包的基本信息以及自动发现信息,示例如下:{
 "name": "wanzij/swoole-reverb",
 "autoload": {
 "psr-4": {
 "SwooleReverb\\": "src/"
 }
 },
 "extra": {
 "laravel": {
 "providers": [
 "SwooleReverb\\Providers\\BroadcastServiceProvider",
 "SwooleReverb\\Providers\\SwooleReverbServiceProvider"
 ]
 }
 }
 }
 然后执行: composer require wanzij/swoole-reverb:"dev-main"
 提示:最初使用 dev-master可能会报错,因为包分支名称可能已经从 master 改为了 main。
这个流程就是正确完整的扩展包开发流程。
- 手动注册服务提供者
 当然在前期的开发中,我们为了方便,上面的方式更可取,因为不用每次更新代码后,执行composer update更新,所以如果不想采用本地路径仓库的方式,也可以直接在config/app.php中手动注册服务提供者:'providers' => [
 // 其他服务提供者...
 SwooleReverb\Providers\BroadcastServiceProvider::class,
 SwooleReverb\Providers\SwooleReverbServiceProvider::class,
 ],
 这样可以确保服务提供者被加载。 
三、开发中的常见问题及解决方案
1. 类找不到或命名空间错误
- 问题:在执行 php artisan vendor:publish时找不到服务提供者。
- 解决:确认 composer dump-autoload已执行,检查目录结构和文件顶部的命名空间是否正确。
2. 依赖容器绑定错误
- 问题:使用 $this->app->make('broadcast')报Target class [broadcast] does not exist.错误。
- 解决:可以直接使用完整类名 \Illuminate\Broadcasting\BroadcastManager::class来获取实例,例如:$this->app->make(\Illuminate\Broadcasting\BroadcastManager::class)->extend('swoole', function ($app, $config) {
 return new SwooleBroadcaster(
 $config['host'] ?? 'localhost',
 $config['port'] ?? 8084,
 $config['options'] ?? []
 );
 });
 
3. Composer 版本稳定性问题
- 问题:安装包时提示最低稳定性问题,例如:
Could not find a version of package wanzij/swoole-reverb matching your minimum-stability (stable).
 
- 解决:
- 显式指定使用开发版:
composer require wanzij/swoole-reverb:"dev-main"
 
- 或者在主项目 composer.json中调整最低稳定性:"minimum-stability": "dev",
 "prefer-stable": true
 
 
- 显式指定使用开发版:
四、总结
看完后,我们关心的点又: Laravel 的自动发现机制、 Composer 的本地路径仓库配置以及容器绑定的相关问题。
后续我会继续分享更多关于扩展包开发的细节和实践经验,敬请关注!
如果有任何问题或建议,欢迎在评论区留言讨论。
更多文档参考:
Laravel11 从0开发 Swoole-Reverb 扩展包(一) - 扩展包开发的更多相关文章
- Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)
		最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ... 
- Android开发 互相调用模式之导出Jar包、扩展MainActivity、Java主导
		首先讲导出Jar包,在以前都是用这种方法,但是现在官方不推荐使用此方法,官方推荐导出Aar包 (1)首先创建一个Android空工程 注意:这里选择API 16,因为Unity支持的最低是API 16 ... 
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十一║Vue实战:开发环境搭建【详细版】
		缘起 哈喽大家好,兜兜转转终于来到了Vue实战环节,前边的 6 篇关于Vue基础文章我刚刚简单看了看,感觉写的还是不行呀,不是很系统,所以大家可能看上去比较累,还是得抽时间去润润色,修改修改语句和样式 ... 
- PHP7 学习笔记(一)Ubuntu 16.04 编译安装Nginx-1.10.3、 PHP7.0.9、Redis3.0 扩展、Phalcon3.1 扩展、Swoole1.9.8 扩展、ssh2扩展(全程编译安装)
		==================== PHP 7.0 编译安装================== wget http://cn2.php.net/get/php-7.0.9.tar.bz2/fr ... 
- JetBrains IntelliJ IDEA for Mac 15.0 破解版 – Mac 上强大的 Java 集成开发工具
		应网友要求更新. IntelliJ IDEA 是最强大的 Java IDE 之一,由知名的Jetbrainsg公司出品,最新版本增加了大量强大易用的特性,比如 Java 8 的Lambda 表达式调试 ... 
- 【Android】1.0 第1章 C#之Android手机App开发
		分类:C#.Android.VS2015:创建日期:2016-01-20 目前Android在全世界市场上大约有75%的占有率,国人Android手机的持有比例更甚,甚至达到90%以上.因此搞计算机的 ... 
- Eclipse用Runnable JAR file方式打jar包,并用该jar包进行二次开发
		目录: 1.eclipse创建Java项目(带jar包的) 2. eclipse用Export的Runnable JAR file方式打jar包(带jar包的) 打jar包 1)class2json1 ... 
- Java web开发中主要用到的jar包
		1.Java开发中主要用到的jar包介绍:(1)java JDK基础开发包:java包和javax包.书写方式:import java.lang.reflect.InvocationTargetExc ... 
- 使用Vue-cli3.0创建的项目,如何发布npm包
		使用Vue-cli3.0创建的项目,如何发布npm包 在使用vue进行项目开发时,如果我们想要发布一个包,有时候会有点迷糊,不知道应该怎么修改脚手架的默认设置.这里记录一下一些常见的操作. 创建ind ... 
- Xamarin.Forms移动开发系列5 :XAML标记扩展
		摘要 本文主要讲述Xamarin.Forms中XAML的标记扩展. 前言 在Xamarin.Forms移动开发系列4 :XAML基础一文中提到过XAML标记扩展,本文将对标记扩展进行更深入的了解. 大 ... 
随机推荐
- shell 将文件内容读取到 数组中
			#!/bin/bash prod_file=/home/vmuser/linbo/kettleDemo/job/test/CA-20201224.csv test_file=/home/vmuser/ ... 
- Qt/C++音视频开发49-推流到各种流媒体服务程序
			一.前言 最近将推流程序完善了很多功能,尤其是增加了对多种流媒体服务程序的支持,目前支持mediamtx.LiveQing.EasyDarwin.nginx-rtmp.ZLMediaKit.srs.A ... 
- Qt编写推流综合应用示例-文件推流
			一.功能特点 1.1 文件推流 指定网卡和监听端口,接收网络请求推送音视频等各种文件. 实时统计显示每个文件对应的访问数量.总访问数量.不同IP地址访问数量. 可指定多种模式,0-直接播放.1-下载播 ... 
- Qt开源作品2-视频流播放vlc内核
			一.前言 上一个作品是ffmpeg内核做的,由于ffmpeg太过于强大,很多初学者会看的云里雾里懵逼状态,也有很多用户只需要一个简单的播放视频流即可,根本不需要涉及到负责的解码转码等,于是vlc就上场 ... 
- WebClient 用法小结
			进来的项目中要实现能够在windows service中调用指定项目的链接页面.由于访问页面时候使用的是ie浏览器或其他浏览器,所以想起用webclient类. 如果只想从特定的URI请求文件,则使用 ... 
- WxPython跨平台开发框架之前后端结合实现附件信息的上传及管理
			在使用 wxPython 开发跨平台应用时,结合后端实现附件信息的上传和管理是一种常见需求.WxPython跨平台开发框架是前后端分离的框架,前端采用的是WxPython + aiohttp 来构建跨 ... 
- Chrome谷歌浏览器自动升级后页面字体过小
			谷歌浏览器使用一段时间后系统自动升级后页面字体突然变小,如何进行设置呢,如下 1.在页面右上角选择浏览器设置-外观-自定义字体-设置字号等其他需要配置的参数即可 
- 画(HB To Ryby!)
			"客人,请描述得具体一点." 他似乎还是很难为情. "呃--就是--一个女孩儿",他又勉强启开嘴,"女孩儿"三个字几乎被咽进嗓子 ... 
- DICOM-SCP,可以直接使用的SCP(.net framework 4.6.1以上)控制台接收端
			此程序只能运行在.net framework 4.6.1版本上的环境,如果要运行在低版本环境,请看上一篇文档 using System; using System.IO; using System.T ... 
- TCP/IP协议笔记
			TCP/IP 一.TCP/IP简介 TCP/IP 指传输控制协议/网际协议(Transmission Control Protocol / Internet Protocol),是用于因特网 (Int ... 
