- 后端
- Web框架
【免费下载链接】symfony
The Symfony PHP framework
本文以 Smsc/CHANGELOG.md 为脉络主线,系统梳理 Symfony Notifier 中 SMSC(smsc.ru)短信桥接组件的三次关键演进:5.4 版本新增桥接、6.2 版本支持自定义发件人
from、8.2 版本新增sslDSN 选项。读者将掌握该桥接的 DSN 配置规范、请求参数体系、底层调用链与测试验证方法,能够直接在项目中接入 SMSC 短信服务并灵活控制 HTTPS/HTTP 传输方式。
一、SMSC 桥接组件是什么
SMSC(smsc.ru 目录下。
该桥接由SmscTransport(传输器)与SmscTransportFactory(传输器工厂)两个核心类构成:
- SmscTransport.php:负责把
SmsMessage编码为 smsc.ru 的 API 请求体,发送到https://smsc.ru/sys/send.php端点,并解析响应; - SmscTransportFactory.php:负责解析
SMSC_DSN环境变量,校验 scheme、提取登录名/密码/发件人,构造传输器实例。
从 composer.json 可以看到其依赖关系:php >= 8.4.1、symfony/http-client ^7.4|^8.0、symfony/notifier ^8.2,说明该桥接是 Notifier 生态中独立的可安装包(symfony/smsc-notifier)。
二、CHANGELOG 中的三次关键演进
CHANGELOG.md 完整记录了该桥接的生命周期,共三个版本节点:
| 版本 | 变更内容 | 对应源码位置 |
|---|---|---|
| 5.4 | 新增 SMSC 桥接 | SmscTransport.php、SmscTransportFactory.php |
| 6.2 | 消息定义了SmsMessage->from时优先使用它 | SmscTransport::doSend() |
| 8.2 | 新增sslDSN 选项,支持走明文 HTTP | SmscTransportFactory::create()、AbstractTransport::setSsl() |
下面逐一展开。
三、5.4:桥接的诞生与基础 DSN 配置
3.1 安装与启用
在 Symfony 6.2 之前的早期版本中,桥接作为symfony/notifier的一部分随主包发布(5.4 时代桥接随 Notifier 组件一起维护)。在 8.x 时代则通过 Composer 单独引入:
composer require symfony/smsc-notifier3.2 DSN 配置规范
README.md 给出了标准的 DSN 格式:
SMSC_DSN=smsc://LOGIN:PASSWORD@default?from=FROM各字段含义:
LOGIN:你在 smsc.ru 的登录名;PASSWORD:API 密码;FROM:短信发件人标识(注意是文本标识,不是电话号码);default:占位主机名,工厂会把default替换为内置默认主机smsc.ru(见 SmscTransport.php 中protected const HOST = 'smsc.ru')。
在.env中配置后,Notifier 会通过SmscTransportFactory自动装配。从 SmscTransportFactoryTest.php 的supportsProvider可以看到,工厂只认smsc这一个 scheme,其它 scheme 一律抛出UnsupportedSchemeException。
3.3 工厂如何解析 DSN
SmscTransportFactory.php 的create()方法揭示了 DSN 的解析逻辑:
$login = $dsn->getUser(); $password = $dsn->getPassword(); $from = $dsn->getRequiredOption('from'); $host = 'default' === $dsn->getHost() ? null : $dsn->getHost(); return (new SmscTransport($login, $password, $from, $this->client, $this->dispatcher)) ->setHost($host) ->setSsl($this->getSsl($dsn));关键点:
from是必填选项:getRequiredOption('from')一旦缺失就会抛异常。测试 missingRequiredOptionProvider 专门验证了smsc://login:password@default(缺少from)这一失败场景;- 主机名取
default时置为null,由AbstractTransport::getDefaultHost()回落到常量HOST = 'smsc.ru'; setSsl()的返回值来自父类 AbstractTransportFactory::getSsl():读取 DSN 中ssl选项,若未提供则返回null(表示沿用传输器默认值)。
四、6.2:发件人优先级 ——SmsMessage->from优先
4.1 变更动机
6.2 之前,发送短信时固定使用 DSN 中配置的from发件人。6.2 引入的变更让消息级发件人覆盖 DSN 级发件人,为"不同业务场景使用不同签名"提供了灵活性。
4.2 源码实现
SmscTransport::doSend() 中有一行关键代码:
'sender' => $message->getFrom() ?: $this->from,逻辑一目了然:如果SmsMessage实例通过->from(...)设置了发件人,则使用消息自带的发件人;否则回退到构造传输器时传入的$this->from(来自 DSN)。
与之配套的还有消息支持类型的校验(同文件 L48-L51):
public function supports(MessageInterface $message): bool { return $message instanceof SmsMessage; }测试 SmscTransportTest.php 分别验证了SmsMessage被支持、ChatMessage与DummyMessage不被支持。
4.3 发送一条带自定义发件人的短信
use Symfony\Component\Notifier\Message\SmsMessage; use Symfony\Component\Notifier\Notifier; // $notifier 为注入的 Notifier 服务 $sms = new SmsMessage('+79160000000', '订单已发货:快递单号 123456'); $sms->from('ShopBot'); // 覆盖 DSN 中的 from $notifier->send($sms);五、8.2:sslDSN 选项 —— 可切换明文 HTTP
5.1 变更内容
8.2 版本新增sslDSN 选项,允许请求走明文 HTTP(plain HTTP)。这通常用于受网络环境限制、无法建立 TLS 连接的内网/测试场景。
配置方式:
# 默认(不指定 ssl):走 HTTPS SMSC_DSN=smsc://LOGIN:PASSWORD@default?from=FROM # 显式关闭 SSL:走明文 HTTP SMSC_DSN=smsc://LOGIN:PASSWORD@default?from=FROM&ssl=0ssl选项取值遵循 DSN 布尔值解析规则(AbstractTransportFactory::getSsl()调用$dsn->getBooleanOption('ssl')),1/true/0/false均被识别。
5.2 底层实现原理
该选项的生效路径跨两个类:
- 解析阶段:
SmscTransportFactory::create()调用$this->getSsl($dsn),得到true/false/null三态值,通过链式调用->setSsl(...)写入传输器; - 发送阶段:
AbstractTransport::getHttpScheme()决定请求协议,见 AbstractTransport.php:
protected function getHttpScheme(): string { return ($this->ssl ?? static::SSL) ? 'https' : 'http'; }SmscTransport未重写父类的SSL常量,因此继承默认值protected const SSL = true(同文件 L32)。这意味着:
- DSN 未指定
ssl→ssl为null→ 走static::SSL默认true→HTTPS; - DSN 指定
ssl=0→ssl为false→HTTP(明文); - DSN 指定
ssl=1→ 显式HTTPS。
最终在 SmscTransport::doSend() 中拼出完整端点:
$endpoint = \sprintf('%s://%s/sys/send.php', $this->getHttpScheme(), $this->getEndpoint());getEndpoint()则返回host[:port](见 AbstractTransport.php)。
⚠️ 安全提示:
ssl=0会使登录名与密码以明文形式在网络上传输,仅建议在受控的内网环境或调试阶段使用,生产环境应保持默认的 HTTPS。
六、请求与响应的完整调用链
6.1 请求体参数
SmscTransport::doSend() 构建的 POST body 与 smsc.ru 的sys/send.phpAPI 对齐:
| 参数 | 来源 | 说明 |
|---|---|---|
login | DSN 用户名 | smsc.ru 登录名 |
psw | DSN 密码 | API 密码 |
sender | $message->getFrom() ?: $this->from | 发件人标识(6.2 起消息优先) |
phones | $message->getPhone() | 接收手机号 |
mes | $message->getSubject() | 短信正文 |
fmt | 固定3 | 要求响应返回 JSON |
charset | 固定utf-8 | 字符集 |
time | 固定0-24 | 发送时段(全天可发) |
6.2 响应处理与错误映射
发送请求后,传输器对响应做三层解析(L73-L85):
- 网络层异常(
HttpTransportExceptionInterface)→TransportException:"Could not reach the remote smsc.ru server."; - 解码异常(
HttpDecodingExceptionInterface)→TransportException:"Could not decode the response from remote smsc.ru server."; - 其它 HTTP 异常 →
TransportException:"Unexpected response from remote smsc.ru server."; - 业务错误:响应中出现
error字段时,抛出带error_code与error文案的TransportException。
成功时构造SentMessage并把服务端返回的id写入消息 ID(L87-L90),方便后续对账与追踪。
6.3 事件分发
传输器继承自AbstractTransport,其send()方法(AbstractTransport.php L81-L100)在发送前后分发MessageEvent、SentMessageEvent,失败时分发FailedMessageEvent。也就是说,SMSC 桥接天然接入 Symfony Notifier 的事件体系,可用于日志记录、监控告警等横切逻辑。
七、测试验证:如何确认桥接行为
桥接提供了两套测试用例,可作为接入前验证与回归参考:
- SmscTransportTest.php:继承
TransportTestCase,验证字符串化输出(smsc://smsc.ru?from=MyApp)、支持/不支持的消息类型; - SmscTransportFactoryTest.php:继承
AbstractTransportFactoryTestCase并组合MissingRequiredOptionTestTrait,覆盖 DSN 创建、scheme 支持判定、缺失from报错、不支持的 scheme 报错四类场景。
运行桥接测试(在仓库根目录下):
php phpunit src/Symfony/Component/Notifier/Bridge/Smsc/Tests八、总结
SMSC 桥接组件从 5.4 的"可用"起步,到 6.2 的"灵活"(消息级发件人覆盖),再到 8.2 的"可控"(sslDSN 选项切换明文/加密传输),三个版本节点完整覆盖了短信桥接的核心诉求。理解 CHANGELOG.md 背后对应的工厂解析、传输器编码与基类AbstractTransport的机制,开发者就能在真实项目中精准配置 DSN、合理选择 HTTPS/HTTP 传输方式,并利用事件与测试体系保障短信链路的稳定。
- 后端
- Web框架
【免费下载链接】symfony
The Symfony PHP framework
相关推荐
Symfony LinkedIn Notifier 桥接器演进解析:从 5.2 引入到 8.2 的组织账号与 ssl 选项
Symfony LinkedIn Notifier 桥接器演进解析:从 5.2 引入到 8.2 的组织账号与 ssl 选项 本篇技术指南以 Symfony No
后端Web框架Symfony Notifier ClickSend 短信桥接:DSN 配置、消息选项与 8.2 新增 `ssl` 选项解析
Symfony Notifier ClickSend 短信桥接:DSN 配置、消息选项与 8.2 新增 ssl 选项解析 本文以 Symfony 开源仓库中 C
后端Web框架Symfony Notifier 的 iSendPro 短信桥接器:DSN 配置、ssl 选项与版本演进全解析
Symfony Notifier 的 iSendPro 短信桥接器:DSN 配置、ssl 选项与版本演进全解析 iSendPro 是法国电信服务商提供的短信(S
后端Web框架
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考