ThinkPHP集成EasySms需五步:一、用Composer安装依赖;二、在config目录建easysms.php配置网关;三、封装SmsService类解耦调用;四、控制器校验后调用发送;五、配置服务容器绑定实现依赖注入。

如果您在ThinkPHP项目中需要实现短信发送功能,但面临多服务商适配困难、配置分散、容错能力弱等问题,则可能是由于缺乏统一的短信抽象层。以下是针对ThinkPHP框架集成Overtrue/EasySms平台的具体操作步骤:
一、安装EasySms依赖包
Overtrue/EasySms以Composer包形式发布,需通过命令行引入至ThinkPHP项目中,确保PHP版本满足要求(推荐7.2+),并已启用cURL扩展。该步骤为后续所有功能的基础支撑。
1、进入ThinkPHP项目根目录,执行安装命令:
composer require overtrue/easy-sms
2、若使用ThinkPHP6,建议添加详细日志输出以排查安装异常:
composer require overtrue/easy-sms -vvv
立即学习“PHP免费学习笔记(深入)”;
3、验证是否成功写入vendor目录下的overtrue/easy-sms子目录,并检查composer.lock中是否存在对应条目。
二、创建并配置easysms.php文件
配置文件用于声明网关策略、超时参数及各服务商密钥信息,必须置于ThinkPHP标准配置路径下(如config/或application/config/),否则运行时将因找不到配置而抛出异常。
1、在config目录下新建easysms.php文件。
2、填入以下结构化配置(以阿里云与云片双网关为例):
return [
'timeout' => 5.0,
'default' => [
'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class,
'gateways' => ['aliyun', 'yunpian'],
],
'gateways' => [
'aliyun' => [
'access_key_id' => '您的阿里云AccessKey ID',
'access_key_secret' => '您的阿里云AccessKey Secret',
'sign_name' => '已审核通过的短信签名',
],
'yunpian' => [
'api_key' => '云片API Key',
],
],
];
三、封装短信服务类
为避免控制器中直接调用EasySms实例导致耦合度升高,应独立封装可复用的服务类,支持业务类型识别、频率限制与错误统一处理。
1、在app/common/service/目录下新建SmsService.php文件。
2、定义类并注入EasySms实例:
use Overtrue\EasySms\EasySms;
class SmsService {
protected $easySms;
public function __construct(EasySms $easySms) {
$this->easySms = $easySms;
}
}
3、添加发送方法,传入手机号、验证码模板ID及数据:
public function sendCode($phone, $template, $data = []) {
try {
return $this->easySms->send($phone, [
'template' => $template,
'data' => $data,
]);
} catch (\Overtrue\EasySms\Exceptions\NoGatewayAvailableException $e) {
throw new \Exception('所有配置网关均不可用,请检查网络或密钥有效性');
}
}
四、在控制器中调用短信服务
控制器负责接收HTTP请求参数并触发短信逻辑,需确保手机号格式校验、业务场景判断及异常捕获机制完备。
1、在app/controller/Api.php中引入服务类:
use app\common\service\SmsService;
2、定义发送验证码接口方法:
public function sendVerifyCode() {
$phone = input('phone');
if (!validateMobile($phone)) {
return json(['code' => 400, 'msg' => '手机号格式不合法']);
}
$code = rand(1000, 9999);
$result = (new SmsService(new EasySms(config('easysms'))))->sendCode(
$phone,
'SMS_XXXXXX', // 阿里云模板CODE
['code' => $code]
);
return json(['code' => 200, 'msg' => '发送成功']);
}
五、配置自动加载与依赖注入
ThinkPHP5/6默认不自动注册第三方类库服务容器绑定,需手动声明EasySms实例以便在任意位置通过依赖注入获取。
1、在application/provider.php(TP6)或application/tags.php(TP5)中添加服务提供者定义。
2、TP6环境下,在app/provider.php中追加:
return [
Overtrue\EasySms\EasySms::class => [\n __factory => [\n Overtrue\EasySms\EasySms::class,\n 'args' => [config('easysms')],\n ],\n ],\n];
3、TP5环境下,需在common.php中手动实例化并绑定到容器:
Container::get('think\Container')->bind('easysms', function () {
return new \Overtrue\EasySms\EasySms(config('easysms'));
});



















