aliasproject / laravel-echo-api-gateway
Laravel Echo 与 API Gateway Websockets
Requires
- php: ^8.0|^8.1|^8.2
- ext-json: *
- aws/aws-sdk-php: ^3.294
- bref/bref: ^2.1
- guzzlehttp/guzzle: ^6.3|^7.0
- laravel/framework: ^8.0|^9.0|^10.0
Requires (Dev)
- mockery/mockery: ^1.2
- nunomaduro/larastan: ^0.7
- orchestra/testbench: ^6.9
- pestphp/pest: ^1.0
- phpunit/phpunit: ^8.0|^9.0
This package is auto-updated.
Last update: 2024-08-29 18:45:35 UTC
README
未维护!!!
目前我没有时间维护这个包。
我的建议是使用无服务器的 Soketi: https://renoki-25232877.hubspotpagebuilder.eu/soketi-serverless
基本免费使用,构建得非常好。
此包允许您将 API Gateway 的 Websockets 作为 Laravel Echo 的驱动程序,因此您不必使用 Pusher 或 Socket.io 等服务。
它通过在 API Gateway 中设置一个 websocket API 来工作,并将其配置为在发送到 websocket 的每个消息时调用 Lambda 函数。此包包括并自动配置了一个处理程序来响应这些 websocket 消息。我们还配置 Laravel 使用此连接作为广播驱动程序。
此包目前仅适用于 Bref 或 Laravel Vapor,尽管后者需要一些手动设置。
一旦发布 1.0 版本,此包就适用于生产工作负载。在此之前,建议仅将此包用于非关键/非生产项目。
要求
为了使用此包,您的项目需要满足以下标准
- PHP 7.4 或 8.x
- Laravel 6, 7 或 8
- 使用 bref 或 Laravel Vapor 部署到 AWS
- 有一个工作队列
- 使用 Laravel Mix 或其他工具来捆绑您的资源
安装
此包的安装相当简单。
首先,我们必须安装 composer 和 npm 包
composer require aliasproject/laravel-echo-api-gateway
yarn add laravel-echo-api-gateway
# or
npm install --save-dev laravel-echo-api-gateway
平台特定说明
A. 使用 Bref
接下来,当使用 Bref 时,我们必须在我们的 serverless.yml
文件中添加一些元素。如果使用 Vapor,这些资源必须使用 AWS CLI 或控制台手动创建。
添加一个新的函数来处理 websocket 事件(消息等)
functions: # Add this function websocket: handler: handlers/websocket.php layers: - ${bref:layer.php-80} events: - websocket: $disconnect - websocket: $default
添加一个资源来创建和配置我们的 DynamoDB 表,其中将存储连接
resources: Resources: # Add this resource ConnectionsTable: Type: AWS::DynamoDB::Table Properties: TableName: connections AttributeDefinitions: - AttributeName: connectionId AttributeType: S - AttributeName: channel AttributeType: S KeySchema: - AttributeName: connectionId KeyType: HASH - AttributeName: channel KeyType: RANGE GlobalSecondaryIndexes: - IndexName: lookup-by-channel KeySchema: - AttributeName: channel KeyType: HASH Projection: ProjectionType: ALL - IndexName: lookup-by-connection KeySchema: - AttributeName: connectionId KeyType: HASH Projection: ProjectionType: ALL BillingMode: PAY_PER_REQUEST
添加以下 iamRoleStatement
以启用我们的 Lambda 函数访问该表
provider: name: aws iamRoleStatements: # Add this iamRoleStatement - Effect: Allow Action: [ dynamodb:Query, dynamodb:GetItem, dynamodb:PutItem, dynamodb:UpdateItem, dynamodb:DeleteItem, dynamodb:BatchWriteItem, ] Resource: - !GetAtt ConnectionsTable.Arn - !Join ["", [!GetAtt ConnectionsTable.Arn, "/index/*"]]
添加一个环境变量来自动生成我们的 websocket URL
provider: name: aws environment: # Add these variables BROADCAST_DRIVER: laravel-echo-api-gateway LARAVEL_ECHO_API_GATEWAY_DYNAMODB_TABLE: !Ref ConnectionsTable LARAVEL_ECHO_API_GATEWAY_API_ID: !Ref WebsocketsApi LARAVEL_ECHO_API_GATEWAY_API_STAGE: "${self:provider.stage}"
接下来,在 handlers/websocket.php
中创建 PHP 处理程序文件
<?php use AliasProject\LaravelEchoApiGateway\Handler; use Illuminate\Foundation\Application; require __DIR__ . "/../vendor/autoload.php"; /** @var Application $app */ $app = require __DIR__ . "/../bootstrap/app.php"; $kernel = $app->make(Illuminate\Contracts\Console\Kernel::class); $kernel->bootstrap(); return $app->make(Handler::class);
现在,通过运行 serverless deploy
或类似的命令来部署您的应用程序。记下输出中给出的 websocket URL。
B. 使用 Vapor
当使用 Vapor 时,您必须使用 AWS CLI 或控制台手动创建这些所需资源
B1. 连接 DynamoDB 表
为连接创建一个 DynamoDB 表。使用 connectionId
(字符串)作为 HASH 键,使用 channel
(字符串)作为 SORT 键。设置容量设置为任何您喜欢(可能是按需)。
创建 2 个索引
- 名称:
lookup-by-connection
,键:connectionId
,无排序键,投影:ALL - 名称:
lookup-by-channel
,键:channel
,无排序键,投影:所有
B2. API网关
创建一个新的WebSocket API。输入名称并保留路由选择表达式不变。添加$disconnect
和$default
。将两个集成都设置为Lambda
并从列表中选择你的CLI Lambda。设置阶段的名称为你想要的名称并创建API。创建后,记下ID,因为稍后我们需要用到它。
B3. IAM权限
在IAM中,转到角色并打开laravel-vapor-role
。打开内联策略并编辑它。在JSON选项卡中,将"execute-api:*"
添加到操作列表中。
然后,登录到Laravel Vapor,转到团队设置,AWS账户,点击正确账户旁边的角色并取消选中接收更新。
编辑你的.env
BROADCAST_DRIVER=laravel-echo-api-gateway LARAVEL_ECHO_API_GATEWAY_DYNAMODB_TABLE=the-table-name-you-entered-when-creating-it LARAVEL_ECHO_API_GATEWAY_API_ID=your-websocket-api-id LARAVEL_ECHO_API_GATEWAY_API_STAGE=your-api-stage-name
生成前端代码
添加到你的javascript文件
import Echo from "laravel-echo"; import { broadcaster } from "laravel-echo-api-gateway"; window.Echo = new Echo({ broadcaster, // replace the placeholders host: "wss://{api-ip}.execute-api.{region}.amazonaws.com/{stage}", });
最后,你需要通过运行Laravel Mix来生成你的资源。完成这一步后,你应该可以正常运行。