- 后端
- Web框架
【免费下载链接】symfony
The Symfony PHP framework
本指南以 Symfony 官方仓库中 AllMySms Notifier Bridge 的 README 为核心,完整讲解如何在 Symfony Notifier 中接入法国短信服务商 AllMySms:从 DSN 配置、消息发送,到使用AllMySmsOptions注入发送时间、模拟模式、唯一标识符等高级选项。读完本文,你将掌握allmysms://传输通道的完整配置方式,并能结合源码理解其底层 HTTP 调用与响应处理细节。
一、AllMySms Bridge 是什么
AllMySms 是法国的一家短信批量发送服务商(官网地址见 README)。本仓库中的symfony/all-my-sms-notifier桥接包为 Symfony Notifier 组件提供 AllMySms 集成能力,使开发者可以像使用其他通道(如 Twilio、Vonage)一样,通过统一的消息 API 向 AllMySms 发送短信。
该桥接包位于仓库的 src/Symfony/Component/Notifier/Bridge/AllMySms 目录,由四个核心文件构成:
- AllMySmsTransport.php:实际执行 HTTP 请求的传输器;
- AllMySmsTransportFactory.php:负责解析 DSN、创建传输器;
- AllMySmsOptions.php:承载发送可选参数的消息选项类;
- 三个测试文件:
Tests/AllMySmsTransportTest.php、Tests/AllMySmsTransportFactoryTest.php、Tests/AllMySmsOptionsTest.php,用于验证各组件行为。
二、DSN 配置:一行搞定账号与默认发送号码
README 给出的 DSN 格式如下:
ALLMYSMS_DSN=allmysms://LOGIN:APIKEY@default?from=FROM其中各字段含义:
| DSN 片段 | 含义 | 说明 |
|---|---|---|
LOGIN | 你的用户 ID | 必填,对应 AllMySms 账号的用户标识 |
APIKEY | 你的 AllMySms API 密钥 | 必填,用于 HTTP Basic 认证 |
FROM | 发送方号码 | 可选,默认值为36180 |
在 Symfony 应用中,通常将该 DSN 写入.env文件,然后通过symfony/notifier的Texter服务(服务 id 为texter)直接发送短信,无需手写传输器。
从源码看,DSN 的解析发生在 AllMySmsTransportFactory::create():
$this->getUser($dsn)取出 DSN 中的LOGIN;$this->getPassword($dsn)取出APIKEY;$dsn->getOption('from')读取from选项;- 当 host 为
default时,host 保持为null,最终由传输器内部的HOST常量(api.allmysms.com)决定实际端点。
因此allmysms://LOGIN:APIKEY@default?from=FROM中的default只是一个占位符,实际请求会发往api.allmysms.com。
2.1 需要重点注意的 DSN 校验规则
测试文件 AllMySmsTransportFactoryTest.php 还揭示了几条容易被忽略的约束:
- 缺少
APIKEY(如allmysms://login@default)或缺少LOGIN(如allmysms://:apiKey@default)都会被判定为不完整 DSN(incomplete DSN),无法创建传输器; - 只有
allmysms://scheme 才被支持(见supportsProvider与unsupportedSchemeProvider),其他 scheme 会抛出UnsupportedSchemeException; from是可选项,DSN 中可省略(如allmysms://login:apiKey@host.test),也可显式指定(如allmysms://login:apiKey@host.test?from=TEST)。
2.2ssl选项:按需关闭 HTTPS
从 CHANGELOG.md 可以看到,8.2 版本新增了sslDSN 选项,用于让请求走明文 HTTP。对应源码中,工厂通过$this->getSsl($dsn)决定传输器使用的协议(默认启用 HTTPS)。一般生产环境保持默认即可,只有在明确的调试或内网场景下才考虑?ssl=0。
三、发送短信:从 SmsMessage 到 Texter
与其他 Notifier 通道一致,发送流程是:创建SmsMessage→ 绑定可选选项 → 交给texter发送。README 给出的完整示例:
use Symfony\Component\Notifier\Message\SmsMessage; use Symfony\Component\Notifier\Bridge\AllMySms\AllMySmsOptions; $sms = new SmsMessage('+1411111111', 'My message'); $options = (new AllMySmsOptions()) ->alerting(1) ->campaignName('API') ->cliMsgId('test_cli_msg_id') ->date('2023-05-23 23:47:25') ->simulate(1) ->uniqueIdentifier('unique_identifier') ->verbose(1) // ... ; // Add the custom options to the sms message and send the message $sms->options($options); $texter->send($sms);其中SmsMessage构造函数的两个核心参数分别是接收方手机号(+1411111111)和短信正文(My message)。$texter即 Symfony 的TexterInterface服务,在框架应用中直接注入即可。
3.1 传输器支持的消息类型
从 AllMySmsTransport::supports() 可以看到,该传输器只支持SmsMessage,并且其携带的 options 必须是AllMySmsOptions实例(或为 null):
- 若传入
ChatMessage或其他消息类型,会抛出UnsupportedMessageTypeException(测试中unsupportedMessagesProvider对此有明确覆盖); - 因此不要把该桥接用于 Slack、Telegram 等聊天场景,它专司短信。
四、AllMySmsOptions:为短信注入高级选项
AllMySmsOptions实现自 Notifier 的MessageOptionsInterface,全部方法均返回static,支持链式调用,最终通过toArray()输出选项数组。各方法及其底层存储键(见 AllMySmsOptions.php)如下:
| 方法 | 存储键 | 类型 | 说明 |
|---|---|---|---|
alerting(int) | alerting | int | 告警提示开关,传1启用 |
campaignName(string) | campaignName | string | 在 AllMySms 后台标识本次发送所属营销活动名称 |
cliMsgId(string) | cliMsgId | string | 客户端消息 ID,便于回执对账 |
date(string) | date | string | 定时发送时间,README 示例格式为2023-05-23 23:47:25 |
simulate(int) | simulate | int | 模拟模式,传1表示不真实下发、仅做测试 |
uniqueIdentifier(string) | uniqueIdentifier | string | 唯一标识符,用于去重或追踪 |
verbose(int) | verbose | int | 详细日志开关,传1启用 |
这些选项的键名与 AllMySms 官方 HTTP API(v9.0)请求参数一一对应,完整字段含义可参考 README 中给出的官方 API 文档链接。测试文件 AllMySmsOptionsTest.php 验证了链式调用后toArray()的输出结构,可作为编写时的对照参考。
除上述方法外,AllMySmsOptions的构造函数还接收一个可选的初始数组(new AllMySmsOptions(['from' => 'foo'])),测试中的supportedMessagesProvider展示了这一用法,方便从已有数组直接构造选项对象。
五、底层原理:doSend 如何把消息变成 HTTP 请求
理解传输器内部逻辑有助于排查发送失败问题。核心实现在 AllMySmsTransport::doSend(),其调用链如下:
- 组装请求体:从
SmsMessage读取from(优先取消息自身的getFrom(),为空时回退到 DSN 配置的from,再回退到默认36180)、to(手机号)与text(正文),与 options 数组合并,并用array_filter()剔除空值; - 发起 POST 请求:目标端点为
https://api.allmysms.com/sms/send/(协议由ssl选项决定),使用 HTTP Basic 认证(auth_basic传入 login 与 apiKey),请求体为 JSON; - 处理响应:
- 网络层失败(
TransportExceptionInterface)会包装为TransportException,提示 "Could not reach the remote AllMySms server."; - 期望的 HTTP 状态码是201;若状态码不符,会从响应体中提取
description与code抛出异常; - 即使返回 201,若响应缺少
smsId字段,同样视为失败并抛异常;
- 网络层失败(
- 构造 SentMessage:将响应中的
nbSms(发送条数)、balance(账户余额)、cost(本次费用)写入SentMessage的附加信息,并把smsId设为消息 ID。
测试 AllMySmsTransportTest.php 的testSentMessageInfo用 MockHttpClient 模拟了 201 响应,并断言getInfo('nbSms')、getInfo('balance')、getInfo('cost')能正确取回这些值——这也印证了 CHANGELOG 中 7.3 版本 "AddnbSms,balance, andcostinfo into returnedSentMessage" 的说明。
5.1 传输器字符串表示
AllMySmsTransport::__toString()会输出形如allmysms://api.allmysms.com或allmysms://api.allmysms.com?from=TEST的字符串,这在toStringProvider测试中有对应断言,可用于日志记录或SentMessage的传输通道标识。
六、环境要求与安装前提
依据桥接包的 composer.json,使用该桥接需满足:
- PHP 版本>= 8.4.1;
symfony/http-client:^7.4 或 ^8.0;symfony/notifier:^8.2。
由于桥接包位于本仓库的 Notifier Bridge 目录,通常在 Symfony 项目中通过 Composer 安装对应包名symfony/all-my-sms-notifier,然后在.env中配置ALLMYSMS_DSN环境变量即可被 Notifier 自动发现(Notifier 会依据 DSN scheme 匹配到AllMySmsTransportFactory,其getSupportedSchemes()返回['allmysms'])。
七、小结
围绕 README 的 DSN 与消息选项两条主线,本桥接的使用要点可归纳为:
- 用
allmysms://LOGIN:APIKEY@default?from=FROM配置环境变量,LOGIN/APIKEY必填,from可选且默认36180; - 发送时构建
SmsMessage,需要高级能力时用AllMySmsOptions链式配置alerting、campaignName、cliMsgId、date、simulate、uniqueIdentifier、verbose,再$sms->options($options)后交给$texter->send($sms); - 传输器只支持
SmsMessage,底层以 HTTP Basic 认证 POST 到api.allmysms.com/sms/send/,成功以 201 +smsId为判据,并可通过SentMessage::getInfo()获取nbSms、balance、cost等计费信息。
若需深入验证各行为,可直接阅读 Tests 目录下的三个测试文件,它们覆盖了 DSN 解析、选项序列化与成功响应解析等关键路径。
- 后端
- Web框架
【免费下载链接】symfony
The Symfony PHP framework
相关推荐
Bokeh Server 认证钩子(Authentication Hooks)实战:基于 auth-module 为 Bokeh 应用接入登录与登出
Bokeh Server 认证钩子(Authentication Hooks)实战:基于 auth module 为 Bokeh 应用接入登录与登出 导读 Bo
后端Web框架Symfony Brevo Notifier 桥接组件实战:从 Sendinblue 更名到 DSN 短信发送
Symfony Brevo Notifier 桥接组件实战:从 Sendinblue 更名到 DSN 短信发送 本篇指南围绕 Symfony 官方仓库中 Bre
后端Web框架LaMa 大掩码图像修复部署与运维实战指南
LaMa 大掩码图像修复部署与运维实战指南 如果你需要从图片里去掉人物、水印或文字,再把大块缺失区域自然地补回来,LaMa 图像修复值得一试。它是 WACV 2
后端Web框架
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考