From 51517879820de832395efc40bb308a736f33f131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E4=B8=9C=E4=BA=91?= Date: Mon, 16 Jan 2023 22:05:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(Sms):=20=E5=AE=9E=E7=8E=B0=E4=BA=86?= =?UTF-8?q?=E7=9F=AD=E4=BF=A1=E5=8F=91=E9=80=81=E7=9A=84=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Sms.md | 75 ++++++++++++++++++++++++++++ src/ConfigProvider.php | 4 +- src/Events/SmsWillSent.php | 48 ++++++++++++++++++ src/Listener/SmsWillSentListener.php | 61 ++++++++++++++++++++++ 4 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 docs/Sms.md create mode 100644 src/Events/SmsWillSent.php create mode 100644 src/Listener/SmsWillSentListener.php diff --git a/docs/Sms.md b/docs/Sms.md new file mode 100644 index 0000000..100e7d7 --- /dev/null +++ b/docs/Sms.md @@ -0,0 +1,75 @@ +# SMS | 短信 +提供一套通用 Service 用于定制需求,和一套现成的事件/监听器用于异步发送。 + +## 服务类 +[\Singularity\HDK\Core\Service\SmsService](../src/Service/SmsService.php) +* 发送国内短信的 `\Singularity\HDK\Core\Service\SmsService::sendSmsCountryside()` + +## 事件机制 +> 这种方式无法监听短信发送的结果! +> +> 如果你需要根据短信发送的结果进行处理, +> 请使用服务类进行自定义 + +更好的方法可能是在事件发生后触发异步队列, +但如果将异步队列封装在本包中, +相当于强制引用本库的项目使用异步队列机制, +这是我们不愿意看到的。 +所以这里的监听器只是集成了同步发送的操作。 + +如果你想要定义更好的设计, +你可以直接使用提供的 Service 类进行定制。 +> 或许这里还有优化空间😄 + +### 事件 +[\Singularity\HDK\Core\Events\SmsWillSent](../src/Events/SmsWillSent.php) +### 监听器 +[\Singularity\HDK\Core\Listener\SmsWillSentListener](../src/Listener/SmsWillSentListener.php) +### 使用方法 +监听器已经通过 [ConfigProvider](../src/ConfigProvider.php) 机制注册, +所以你只需要在要发送短信的地方调度这个事件即可。 +> 这也就意味着,你无法调用这个事件,但不触发这个监听器。 +> 如果你有这样做的必要,请创建一个自己的事件。 +> 这也是为了保证功能的完整性和原子性。 + +具体使用方法,如下代码所示: + +```php +save(); + + // ↓ + // 这里 dispatch(object $event) 会逐个运行监听该事件的监听器 + $this->eventDispatcher->dispatch(new EmailWillSent( + target: $user->mobile, + subject: '注册成功通知', + type: 'html', // 默认 text 可以不传 + content: <<恭喜你,注册成功! +HTML, + )); + // ↑ + + return $result; + } +} + +``` \ No newline at end of file diff --git a/src/ConfigProvider.php b/src/ConfigProvider.php index 2413615..4cc500a 100644 --- a/src/ConfigProvider.php +++ b/src/ConfigProvider.php @@ -15,6 +15,7 @@ namespace Singularity\HDK\Core; use Hyperf\Contract\StdoutLoggerInterface; use Hyperf\Framework\Logger\StdoutLogger; use Singularity\HDK\Core\Listener\EmailWillSentListener; +use Singularity\HDK\Core\Listener\SmsWillSentListener; class ConfigProvider { @@ -40,7 +41,8 @@ class ConfigProvider ], // 与 commands 类似 'listeners' => [ - EmailWillSentListener::class + EmailWillSentListener::class, + SmsWillSentListener::class ], // 组件默认配置文件,即执行命令后会把 source 的对应的文件复制为 destination 对应的的文件 'publish' => [ diff --git a/src/Events/SmsWillSent.php b/src/Events/SmsWillSent.php new file mode 100644 index 0000000..e022dd9 --- /dev/null +++ b/src/Events/SmsWillSent.php @@ -0,0 +1,48 @@ + + * Powered by PhpStorm + * Created on 2023/1/16 + */ + +namespace Singularity\HDK\Core\Events; + +/** + * Singularity\HDK\Core\Events\SmsWillSent@HDK-Core + * + * @author 李东云 + * Powered by PhpStorm + * Created on 2023/1/16 + * + * @link ../../docs/SMS.md + */ +class SmsWillSent +{ + public function __construct( + /** + * @var non-empty-string $phone 目标手机号 + * @example +8613700000001 + * @example 8613700000001 + * @example 13700000001 + */ + public string $phone, + + /** + * @var array|null $templateParam 模板变量 + */ + public ?array $templateParam = null, + + /** + * @var literal-string|null $templateCode 模板代码 + */ + public ?string $templateCode = null, + + /** + * @var literal-string|null $signName 模板签名 + */ + public ?string $signName = null, + ) { + } +} \ No newline at end of file diff --git a/src/Listener/SmsWillSentListener.php b/src/Listener/SmsWillSentListener.php new file mode 100644 index 0000000..cded15e --- /dev/null +++ b/src/Listener/SmsWillSentListener.php @@ -0,0 +1,61 @@ + + * Powered by PhpStorm + * Created on 2023/1/16 + */ + +namespace Singularity\HDK\Core\Listener; + +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\NotFoundExceptionInterface; +use Singularity\HDK\Core\Events\SmsWillSent; +use Singularity\HDK\Core\Service\SmsService; +use Throwable; + +/** + * Singularity\HDK\Core\Listener\SmsWillSentListener@HDK-Core + * + * @author 李东云 + * Powered by PhpStorm + * Created on 2023/1/16 + */ +class SmsWillSentListener extends AbstractListener +{ + + /** + * @inheritDoc + */ + public function listen(): array + { + return [ + SmsWillSent::class, + ]; + } + + /** + * @param SmsWillSent $event + * @return void + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + */ + public function process(object $event): void + { + $smsService = $this->container->get(SmsService::class); + try { + $smsService->sendSmsCountryside( + phone: $event->phone, + templateCode: $event->templateCode, + templateParam: $event->templateParam, + signName: $event->signName + ); + } catch (Throwable $throwable) { + $code = $throwable->getCode(); + $message = $throwable->getMessage(); + $this->stdoutLogger->alert('短信发送失败!'); + $this->stdoutLogger->error(sprintf("[%u] %s", $code, $message)); + } + } +} \ No newline at end of file