ARTICLE DETAIL

资讯详情

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

Symfony Redlink Notifier 桥接组件:基于 DSN 快速接入 Redlink 短信服务

Symfony Redlink Notifier 桥接组件:基于 DSN 快速接入 Redlink 短信服务 后端Web框架【免费下载链接】symfonyThe Symfony PHP framework项目地址https://gitcode.com/GitHub_Trending/sy/symfony点击查看免费下载导读本文围绕 Symfony Notifier 组件中针对波兰短信服务商 Redlink 的官方桥接包symfony/redlink-notifier位于 src/Symfony/Component/Notifier/Bridge/Redlink展开。它解决了在 Symfony 项目中一行 DSN 配置 标准SmsMessage消息对象即可向 Redlink API 发送短信的集成问题。读完本文你将掌握 Redlink DSN 的完整参数含义、传输工厂的解析逻辑、可选的RedlinkOptions高级参数以及底层 HTTP 调用与错误处理机制可直接在真实项目中落地配置。Redlink 桥接包概述Redlinkredlink.pl是波兰的短信服务SMS提供商。Symfony 通过 Notifier 组件的桥接包bridge机制为其提供了一等公民支持桥接包内部实现TransportInterface把 Notifier 的通用消息模型SmsMessage翻译成 Redlink API 的 HTTP 请求开发者无需关心各家服务商差异化的 API 格式。该桥接包由 Mateusz Żyła 编写包名symfony/redlink-notifier通过 Composer 安装即可使用见 composer.json其依赖要求为PHP 8.4.1symfony/http-client^7.4|^8.0底层 HTTP 客户端symfony/notifier^8.2Notifier 主组件从 CHANGELOG.md 可以看到该桥接包在 6.4 版本首次加入并在 8.2 版本新增了sslDSN 选项允许走纯 HTTP 发送请求默认使用 HTTPS。DSN 配置一行接入 Redlink使用该桥接包的核心是配置环境变量REDLINK_DSN其完整格式如下摘自 README.mdREDLINK_DSNredlink://API_TOKEN:APP_TOKENdefault?fromSENDER_NAMEversionVERSION各组成部分含义DSN 组成部分对应变量说明schemeredlink协议标识固定为redlinkuserAPI_TOKEN用户 API Token可从 Redlink 用户面板user dashboard获取passwordAPP_TOKEN应用Application的 API Tokenhostdefault可填default表示使用默认主机api.redlink.pl也可显式指定自定义主机fromSENDER_NAME发送方 IDsender ID需事先在用户面板中添加versionVERSION要使用的 API 版本例如v2.1可选在 RedlinkTransportFactory.php 的create()方法中可以看到 DSN 各字段与构造参数的映射关系$apiKey $dsn-getUser(); // API_TOKEN - apiToken $appToken $dsn-getPassword(); // APP_TOKEN - appToken $host default $dsn-getHost() ? null : $dsn-getHost(); $port $dsn-getPort(); $from $dsn-getRequiredOption(from); $version $dsn-getRequiredOption(version);注意工厂通过getRequiredOption()强制要求from与version两个查询参数必须存在否则会抛异常。这一点与 README 中VERSION可选的表述略有出入——从 RedlinkTransportFactoryTest.php 的missingRequiredOptionProvider()测试数据可见缺少from或缺少version的 DSN 都会被判定为非法配置yield missing option: from [redlink://apiToken:appTokendefault]; yield missing option: version [redlink://apiToken:appTokendefault?fromTEST];因此实践中的建议是始终在 DSN 中同时带上from与version两个参数即使文档标注 version 可选也以填写v2.1之类明确版本号为稳妥。版本与 SSL 选项从 CHANGELOG.md 与 AbstractTransport.php 的实现可知DSN 还支持ssl选项8.2 新增置为0/false时getHttpScheme()返回http请求改走明文 HTTP默认SSL常量值为true即默认 HTTPShost/port通过setHost()/setPort()注入getEndpoint()会拼接出host:port形式的主机地址。工厂最终构造的传输对象为return (new RedlinkTransport($apiKey, $appToken, $from, $version, $this-client, $this-dispatcher)) -setHost($host)-setPort($port)-setSsl($this-getSsl($dsn));消息支持范围与类型校验该桥接包仅支持短信消息。在 RedlinkTransport.php 中public function supports(MessageInterface $message): bool { return $message instanceof SmsMessage; }doSend()内部也会再次校验若传入非SmsMessage例如PushMessage、ChatMessage将抛出UnsupportedMessageTypeException。对应的 RedlinkTransportTest.php 中supportedMessagesProvider()覆盖了带收件人、带主题、自定义发送方以及带RedlinkOptions的SmsMessageunsupportedMessagesProvider()则验证PushMessage、ChatMessage、DummyMessage均不被支持。发送短信的典型用法use Symfony\Component\Notifier\Message\SmsMessage; use Symfony\Component\Notifier\Notifier; $notifier new Notifier(...); // 由容器注入内部持有 redlink 传输 $sms new SmsMessage(48123123123, Summary); // 收件人、短信内容 $notifier-send($sms);SmsMessage构造函数的第三个参数可传自定义发送方sender发送时优先级为消息级 sender DSN 中的from这在doSend()的$from $message-getFrom() ?: $this-from;中体现。发送流程与底层 HTTP 调用RedlinkTransport继承AbstractTransport见 AbstractTransport.php其send()方法负责派发事件MessageEvent、SentMessageEvent、FailedMessageEvent真正的发送逻辑在doSend()中完成。请求构造$endpoint \sprintf(%s://%s/%s/sms, $this-getHttpScheme(), $this-getEndpoint(), $this-version); $response $this-client-request(POST, $endpoint, [ headers [ Authorization $this-apiToken, Application-Key $this-appToken, ], json array_merge([ sender $from, message $message-getSubject(), phoneNumbers [ $message-getPhone(), ], ], array_filter($options)), ]);关键点请求地址为{scheme}://{host}/{version}/sms例如https://api.redlink.pl/v2.1/sms默认主机常量HOST api.redlink.pl鉴权通过两个 Header 完成Authorization用户 API Token与Application-Key应用 TokenJSON 请求体至少包含sender、message、phoneNumbers三个字段其中phoneNumbers是数组形式可容纳单个或多个收件号码消息携带的RedlinkOptions会通过array_filter()过滤掉空值后合并进请求体。响应处理与错误上报发送完成后按状态码分派处理$statusCode $response-getStatusCode(); // 网络层失败时抛出 TransportExceptionInterface $content $response-toArray(false); if (200 ! $statusCode) { $requestUniqueIdentifier $content[meta][uniqId] ?? ; $errorMessage $content[errors][0][message] ?? ; throw new TransportException(\sprintf(Unable to send the SMS: .$errorMessage.. UniqId: (%s)., $requestUniqueIdentifier), $response); } $messageId $content[data][0][externalId] ?? ; $sentMessage new SentMessage($message, (string) $this); $sentMessage-setMessageId($messageId);若无法连接到 Redlink 服务器抛出TransportException(Could not reach the remote Redlink server.)非 200 状态码会从响应体的meta.uniqId与errors[0].message中提取唯一请求标识和错误消息拼入TransportException便于排查成功时从data[0].externalId取出消息 ID写入SentMessage。传输对象字符串表示__toString()返回脱敏后的 DSN 形式return \sprintf(redlink://%s?from%sversion%s, $this-getEndpoint(), $this-from, $this-version);从 RedlinkTransportTest.php 的toStringProvider()可看到实际输出示例redlink://api.redlink.pl?fromTESTversionv2.1。RedlinkOptions消息级高级参数除了 DSN 中的全局配置桥接包还提供 RedlinkOptions.php 用于为单条短信设置额外参数实现MessageOptionsInterface。toArray()会过滤掉空值getRecipientId()返回externalId可用于消息回执追踪。支持的可链式方法如下方法请求体字段类型说明validity(int $validity)validityint短信有效期scheduleTime(int $scheduleTime)scheduleTimeint定时发送时间type(int $type)typeint消息类型shortLink(bool $shortLink)shortLinkbool是否生成短链接webhookUrl(string $webhookUrl)webhookUrlstring状态回调的 Webhook 地址externalId(string $externalId)externalIdstring业务侧自定义的外部 ID典型用法use Symfony\Component\Notifier\Message\SmsMessage; $options (new RedlinkOptions()) -validity(120) // 有效期 120 分钟 -scheduleTime(1700000000) // 定时发送Unix 时间戳 -shortLink(true) // 启用短链接 -webhookUrl(https://example.com/sms/webhook) -externalId(order-2026-001); $sms new SmsMessage(48123123123, 您的订单已发货, null, $options);上述字段会合并进 POST 请求的 JSON 体array_merge后经array_filter去空从而实现对单条短信的精细化控制。测试中 RedlinkTransportTest.php 也覆盖了携带externalId(aaa-aaa-aaa)的SmsMessage用例验证该参数可正常随消息发送。DSN 校验规则测试用例视角RedlinkTransportFactoryTest.php 依托 Notifier 组件测试基类AbstractTransportFactoryTestCase从四个维度验证了 DSN 行为可视为配置合法性的权威判据createProvider标准 DSNredlink://api.redlink.pl?fromTESTversionv2.1会被规范化为redlink://aaaaa:bbbbbbapi.redlink.pl?fromTESTversionv2.1即 API Token 与 App Token 分别填入 user 与 password 段supportsProviderredlink://...default?fromTEST被识别为受支持的 scheme而somethingElse://...则不被支持missingRequiredOptionProvider缺少from或version均判定为配置缺失unsupportedSchemeProvider / incompleteDsnProvider非redlinkscheme、以及缺少 user 或 password 之一如redlink://aaaaadefault?fromTEST的 DSN 都会被拒绝。这意味着在配置REDLINK_DSN时务必保证scheme 为redlink、同时提供 API Token 与 App Token格式user:password、并显式带上from与version参数。总结Symfony 的 Redlink 桥接包把配置 DSN → 构造SmsMessage→Notifier::send()这条链路完整打通底层通过RedlinkTransportFactory解析 DSN、RedlinkTransport组装鉴权 Header 与 JSON 请求体、RedlinkOptions支持消息级高级参数并有成体系的工厂测试与传输测试保障 DSN 校验与消息类型约束。对于需要在 Symfony 项目中接入 Redlink 短信能力的开发者上述配置与源码细节即可直接指导落地。相关参考文件Redlink 桥接包 READMERedlinkTransport 实现RedlinkTransportFactory 实现RedlinkOptions 实现Redlink 传输测试Redlink 工厂测试赞分享后端Web框架【免费下载链接】symfonyThe Symfony PHP framework项目地址https://gitcode.com/GitHub_Trending/sy/symfony点击查看免费下载相关推荐Symfony Notifier Octopush 桥接组件通过 DSN 快速集成 Octopush 短信服务Symfony Notifier Octopush 桥接组件通过 DSN 快速集成 Octopush 短信服务 本文围绕 Symfony Notifier 的后端Web框架Symfony Notifier 的 Redlink SMS 桥接组件DSN 配置、ssl 选项与源码实现解析Symfony Notifier 的 Redlink SMS 桥接组件DSN 配置、ssl 选项与源码实现解析 导读 Redlink 桥接组件 https:/后端Web框架Symfony Brevo Notifier 桥接组件实战从 Sendinblue 更名到 DSN 短信发送Symfony Brevo Notifier 桥接组件实战从 Sendinblue 更名到 DSN 短信发送 本篇指南围绕 Symfony 官方仓库中 Bre后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表