ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Symfony Firebase Notifier Bridge 版本演进与实战指南:从 FCM v1 迁移到 FirebaseOptions

Symfony Firebase Notifier Bridge 版本演进与实战指南:从 FCM v1 迁移到 FirebaseOptions 后端Web框架【免费下载链接】symfonyThe Symfony PHP framework项目地址https://gitcode.com/GitHub_Trending/sy/symfony点击查看免费下载本篇技术指南以 Firebase Notifier Bridge 的 CHANGELOG 为核心脉络系统梳理 Symfony Notifier 中 Firebase 桥接组件的完整演进史重点剖析 8.2 版本引入的 Firebase Cloud Messaging v1 API 迁移、FirebaseOptions统一选项模型、全新 DSN 格式与ssl选项等关键变更。读完本文你将掌握该桥接组件的 DSN 配置与凭证获取流程、三种消息目标token / topic / condition的发送方式、平台差异化通知选项的组装方法并能结合源码理解底层 JWT 认证与发送调用链。版本演进脉络一个桥接组件的成长史从 CHANGELOG 可以清晰看到 Firebase 桥接组件从实验性功能走向生产可用的完整过程其核心类与文档位于 src/Symfony/Component/Notifier/Bridge/Firebase。版本关键变化5.1.0首次加入该桥接组件Added the bridge5.3桥接组件不再标记为experimental并新增data字段支持8.2全面迁移至 FCM v1 API弃用AndroidNotification/IOSNotification/WebNotification弃用旧 DSN 格式与$token参数新增sslDSN 选项8.2 是自 5.1.0 引入以来最大的一次架构级变更本文后续章节将逐条展开。8.2 核心变更之一全面迁移到 Firebase Cloud Messaging v1 APICHANGELOG 首条即声明Send messages through the Firebase Cloud Messaging v1 API。这意味着消息发送链路从旧版 legacy API 切换到了 Google 官方的 v1 REST 接口。在 FirebaseTransport.php 中可以看到实际端点拼接逻辑$endpoint \sprintf(%s://%s/v1/projects/%s/messages:send, $this-getHttpScheme(), $this-getEndpoint(), $this-projectId);其中HOST常量固定为fcm.googleapis.com见 FirebaseTransport.php最终请求形如https://fcm.googleapis.com/v1/projects/{project_id}/messages:sendv1 API 使用 OAuth 2.0 Bearer Token 鉴权而非旧版 API key请求携带Authorization: Bearer JWT头。桥接组件会在内部自动生成并复用这个 JWTJWT 使用 RS256 算法签名kid头携带private_key_id供 Google 选择验签密钥FirebaseTransport.php载荷中包含iss、sub均为client_email、audhttps://fcm.googleapis.com/、iat、exp当前时间 3600 秒即断言有效期一小时JWT 会被缓存复用直到过期前约 60 秒jwtExpiresAt $time 3540才重新签发见 getJwt()。发送请求体结构为[message $options]$options即由FirebaseOptions组装的消息配置。8.2 核心变更之二FirebaseOptions 统一平台选项CHANGELOG 明确指出DeprecateAndroidNotification,IOSNotificationandWebNotification, useFirebaseOptionsinstead。在 8.2 之前平台差异化配置分散在三个独立类中AndroidNotification.php提供channelId()、icon()、sound()、color()、clickAction()等 Android 专属方法IOSNotification.php提供sound()、badge()、subtitle()、本地化文案等 APNs 专属方法WebNotification.php提供icon()、clickAction()等 Web Push 专属方法。这三个类在 8.2 中全部被标记为弃用其构造函数内均触发trigger_deprecation指向FirebaseOptions::class统一收敛到 FirebaseOptions.php。FirebaseOptions实现了MessageOptionsInterface以一个类承载所有平台的选项组装其提供的链式方法包括方法对应 FCM 消息字段说明title(string)notification.title通知标题会覆盖ChatMessage的 subjectbody(string)notification.body通知正文image(string)notification.image设备上展示的通知图片 URLdata(array)data任意元数据键与值必须为字符串notification(array)notification直接传入完整 notification 配置android(array)androidAndroidConfigwebpush(array)webpushWebpushConfigapns(array)apnsApnsConfigfcmOptions(array)fcm_optionsFcmOptions映射为fcm_options键从实现看FirebaseOptions构造函数接收四个参数target目标标识、options平台选项数组、data元数据、targetType目标类型默认Topic并在toArray()中把目标写入对应键$options[$this-targetType-value] $this-targetFirebaseOptions.php。8.2 核心变更之三全新 DSN 格式与旧格式弃用CHANGELOG 宣告Deprecate thefirebase://USERNAME:PASSWORDdefaultDSN, usefirebase://PROJECT_ID?client_email...private_key_id...private_key...instead。旧式 DSN 通过用户名/密码承载凭证已无法满足 v1 API 的四项必需凭证要求。新 DSN 格式为FIREBASE_DSNfirebase://CLIENT_EMAILdefault?project_idPROJECT_IDprivate_key_idPRIVATE_KEY_IDprivate_keyPRIVATE_KEY其中四个参数全部必填且全部来自 Firebase 控制台下载的服务账号私钥 JSON 文件client_email作为 DSN 的 user 部分project_id对应project_idprivate_key_id对应private_key_idprivate_key对应private_key必须安全地 URL 编码。在 FirebaseTransportFactory.php 中可以看到解析逻辑工厂通过$dsn-getRequiredOption(project_id)、getRequiredOption(private_key_id)、getRequiredOption(private_key)读取三项 query 参数client_email则通过$this-getUser($dsn)从 DSN 的 user 段获取若缺项则抛出MissingRequiredOptionException并触发弃用提示回退到旧式空凭证构造。与之配套FirebaseTransport::__construct()的$token参数在 8.2 被弃用FirebaseTransport.php新签名以$projectId、$clientEmail、$privateKeyId、$privateKey取而代之。测试用例 FirebaseTransportTest.php 也按新签名构造传输实例可作为迁移参考new FirebaseTransport(, test_project_id, firebase-adminsdk-testtest-project.iam.gserviceaccount.com, private_key_id, self::PRIVATE_KEY, $client);从 Firebase 控制台获取凭证按 README.md 的步骤操作登录 Firebase 控制台并进入你的项目点击 Project Overview 旁的齿轮图标进入 Project settings切换到 Service accounts 标签页点击底部的 Generate new private key 按钮下载得到包含私钥的 JSON 文件。该 JSON 文件应包含type、project_id、private_key_id、private_key、client_email、client_id、auth_uri、token_uri、auth_provider_x509_cert_url、client_x509_cert_url、universe_domain等键。README 提供了把 JSON 私钥转换为 DSN 格式的 PHP 脚本核心逻辑是校验client_email、project_id、private_key_id、private_key四项存在后按firebase://%sdefault?project_id%sprivate_key_id%sprivate_key%s拼装其中私钥经urlencode()处理php script_name.php path/to/your/firebase/key.json脚本输出即完整的FIREBASE_DSN...环境变量可直接写入.env。8.2 核心变更之四新增 ssl DSN 选项CHANGELOG 的最后一条 8.2 变更为Add thesslDSN option to send requests over plain HTTP。该选项允许显式控制传输是否走 HTTPS。在工厂的create()中通过$this-getSsl($dsn)解析ssl选项并调用-setSsl(...)FirebaseTransportFactory.php随后 FirebaseTransport.php 用$this-getHttpScheme()决定请求协议。默认启用了 SSL仅在明确需要明文 HTTP 调试等场景下才将其关闭FIREBASE_DSNfirebase://client_emaildefault?project_id...private_key_id...private_key...ssl0发送消息实战三种目标类型与平台选项FirebaseTransport::supports()限定其仅支持ChatMessage且消息携带的选项必须是FirebaseOptions实例FirebaseTransport.php。基础用法use Symfony\Component\Notifier\Message\ChatMessage; use Symfony\Component\Notifier\Bridge\Firebase\FirebaseOptions; $chatMessage new ChatMessage(Hello, you should contribute to Symfony.); $firebaseOptions (new FirebaseOptions(/topics/news)) -title(New message!) -body(This will overwrite the subject from ChatMessage object.) -image(https://path-to-your-image.png) -data([ key1 value1, key2 value2, ]); $chatMessage-options($firebaseOptions); $chatter-send($chatMessage);三种目标类型Firebase 支持向三种目标发送消息由枚举 TargetType.php 定义Topic/Token/Condition通过FirebaseOptions的targetType命名参数指定use Symfony\Component\Notifier\Bridge\Firebase\FirebaseOptions; use Symfony\Component\Notifier\Bridge\Firebase\TargetType; // 以 topic 为目标 $topicOptions new FirebaseOptions(/topics/news, targetType: TargetType::Topic); // 以注册 token 为目标 $tokenOptions new FirebaseOptions(dU5e3nFJf9bE:APA91bH3Kd/exampleToken, targetType: TargetType::Token); // 以 condition 表达式为目标 $conditionOptions new FirebaseOptions(\news\ in topics, targetType: TargetType::Condition);toArray()会把目标写入topic/token/condition键。发送前 doSend() 会校验三者至少设置其一否则抛出InvalidArgumentException同时若 DSN 缺少project_id、private_key_id、private_key会抛出IncompleteDsnExceptionFirebaseTransport.php。平台差异化选项在FirebaseOptions中按平台组装差异化配置最终整体随message字段提交给 FCM v1 APIuse Symfony\Component\Notifier\Bridge\Firebase\FirebaseOptions; use Symfony\Component\Notifier\Bridge\Firebase\TargetType; $detailedOptions (new FirebaseOptions(dU5e3nFJf9bE:APA91bH3Kd/exampleToken, targetType: TargetType::Token)) // 基础选项 -title(New message!) -data([ key1 value1, key2 value2, ]) // Android 专属 -android([ notification [ color #4538D5, ], ]) // WebPush 专属 -webpush([ notification [ icon https://path-to-an-icon.png, ], ]) // APNs 专属 -apns([ payload [ aps [ sound default, ], ], ]) ;各平台数组的合法字段由 FCM v1projects.messages资源定义FirebaseOptions内部通过addAndroidOption()、addWebpushOption()、addApnsOption()等受保护方法为链式方法提供底层支撑FirebaseOptions.php。发送链路与错误处理源码级原理doSend()完整发送流程如下FirebaseTransport.php校验消息类型为ChatMessage校验 DSN 凭证完整性组装$options取FirebaseOptions::toArray()若未设置notification.body则用ChatMessage的 subject 填充确保data键存在发起POST请求携带Authorization: Bearer JWT与json: [message $options]错误处理若 HTTP 请求本身抛TransportExceptionInterface包装为TransportException若响应为 JSON 且含error.message或状态码非 200均抛出携带服务端错误信息的TransportException成功时从响应name字段取出消息 ID构造SentMessage返回。这一逻辑在 FirebaseTransportTest.php 中有对应测试通过MockHttpClient模拟返回含error.message的 JSON状态码 200 与 400 两种场景断言均抛出TransportException。工厂侧则由 FirebaseTransportFactoryTest.php 验证firebase://scheme 受支持、其他 scheme 抛出UnsupportedSchemeException、缺失 user 的 DSN 被视为不完整 DSN。依赖与安装前提桥接组件的依赖声明在 composer.jsonphp 8.4.1ext-opensslJWT 的 RS256 签名依赖openssl_pkey_get_private()与openssl_sign()symfony/http-client实际发送 HTTP 请求symfony/notifierNotifier 核心symfony/deprecation-contracts触发弃用提示。可见 8.2 版本对运行环境有明确要求PHP 8.4 且启用 OpenSSL 扩展。迁移到新版本时需先确认环境满足上述约束再更新 DSN 与代码即可无缝使用 FCM v1 API 带来的全新认证与消息能力。赞分享后端Web框架【免费下载链接】symfonyThe Symfony PHP framework项目地址https://gitcode.com/GitHub_Trending/sy/symfony点击查看免费下载相关推荐FastAPI 从 Pydantic v1 迁移到 Pydantic v2版本演进与渐进式迁移实战指南FastAPI 从 Pydantic v1 迁移到 Pydantic v2版本演进与渐进式迁移实战指南 本文围绕 FastAPI 官方文档 docs/fr/d后端Web框架API设计Symfony Sinch Notifier Bridge 版本演进全解从新增集成到 ssl DSN 选项的实战指南Symfony Sinch Notifier Bridge 版本演进全解从新增集成到 ssl DSN 选项的实战指南 导读 本文基于 Symfony Noti后端Web框架golang-jwt/jwt 版本演进全史从 v1 到 v5 的 API 变迁与迁移实战指南golang jwt/jwt 版本演进全史从 v1 到 v5 的 API 变迁与迁移实战指南 jwt go 现为 golang jwt/jwt 是 Go测试云原生质量保障创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表