像这样的场景怎么优化,是否能用 laravel 的事件?
1. 当前使用的 Laravel 版本?
laravel 5.7
2. 问题描述?
项目是一个问答系统。
从发布到完成大概有十几个事件,每个事件有创建动态、模板通知、公众号通知、websocket推送、记录事件用于监控、以及其他各种事情, 其中的 n 种。
现在几乎都是糅合在方法代码中,只有支付后逻辑分离了出来,分发到了 job
中。
这部分代码量尽管在调用上已经尽量简化了,但是显的较臃肿。
后续操作是次要的,出错也问题不大,但在方法中代码报错会影响正常业务。
分散,如果有改动的话,都得到所有方法里改。
我也看了 laravel
文档中关于事件部分,思路不太清晰不敢尝试,向大家请教下思路。
class EventServiceProvider extends ServiceProvider
{
protected $listen = [
'App\Events\Published' => [
'App\Listeners\Dynamic',
..
],
'App\Events\Replied' => [
'App\Listeners\Dynamic',
..
],
];
}
php artisan event:generate
namespace App\Listeners;
use App\Events\Replied;
..
class Dynamic
{
public function __construct(){}
public function handle(Replied $event)
{
//
}
}
Dynamic
怎么监听 Published
Replied
,总不能每种事件创建一个监听者吧 PublishedDynamic
RepliedDynamic
..
队列,Job异步处理
事件和监听不就是干这个的吗, 比如发送消息事件,可以对应
模板通知
、公众号通知
、短信通知
等。 至于发送是同步还是异步配置一下就行了。可以参考这个
我感觉要使用异步处理。
是不是这么个逻辑,
1.先把后续的动作事件分出各种类型。
2.然后在各环节触发事件的时候,按事件所要求的数据,并存储起来。然后就结束了。
3.另外有一个任务计划不断的在跑,处理这些要做的事情。比方说通知, 通知成功就标记,。如果不成功,再记录。
任务计划出错,不影响业务。
如果业务量大,任务计划,可以独立出来,也可以扩容。
我看你右侧的业务好像都是和通知有关的,可以考虑一下使用 Notification,通知系统就是聚合类,在一个通知类中可以定义不同的频道发送消息。
具体可以看下文档
消息通知《Laravel 8 中文文档》
有空试着写写测试,对于代码该怎么组织会有很大帮助。
比如你提到的例子,如果你要写一个发布内容的测试用例,是不是会非常困难。
事件是很好的解耦方式,发布内容应该只进行核心操作,取到内容,写入数据库,然后触发一个发布内容事件。剩下的事情就交给各自的监听器来完成。这样代码的逻辑会比较清晰,以后修改也会很方便。