像这样的场景怎么优化,是否能用 laravel 的事件?

1. 当前使用的 Laravel 版本?

laravel 5.7

2. 问题描述?

项目是一个问答系统。
从发布到完成大概有十几个事件,每个事件有创建动态、模板通知、公众号通知、websocket推送、记录事件用于监控、以及其他各种事情, 其中的 n 种。

Laravel

现在几乎都是糅合在方法代码中,只有支付后逻辑分离了出来,分发到了 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..

focus
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 11

队列,Job异步处理

1周前 评论
php_yt (楼主) 1周前
Cooper

事件和监听不就是干这个的吗, 比如发送消息事件,可以对应模板通知公众号通知短信通知等。 至于发送是同步还是异步配置一下就行了。

1周前 评论
php_yt (楼主) 1周前

可以参考这个 file

1周前 评论
php_yt (楼主) 1周前

我感觉要使用异步处理。
是不是这么个逻辑,
1.先把后续的动作事件分出各种类型。
2.然后在各环节触发事件的时候,按事件所要求的数据,并存储起来。然后就结束了。
3.另外有一个任务计划不断的在跑,处理这些要做的事情。比方说通知, 通知成功就标记,。如果不成功,再记录。
任务计划出错,不影响业务。

如果业务量大,任务计划,可以独立出来,也可以扩容。

1周前 评论
php_yt (楼主) 1周前

我看你右侧的业务好像都是和通知有关的,可以考虑一下使用 Notification,通知系统就是聚合类,在一个通知类中可以定义不同的频道发送消息。

具体可以看下文档

消息通知《Laravel 8 中文文档》

1周前 评论
php_yt (楼主) 1周前

有空试着写写测试,对于代码该怎么组织会有很大帮助。

比如你提到的例子,如果你要写一个发布内容的测试用例,是不是会非常困难。

事件是很好的解耦方式,发布内容应该只进行核心操作,取到内容,写入数据库,然后触发一个发布内容事件。剩下的事情就交给各自的监听器来完成。这样代码的逻辑会比较清晰,以后修改也会很方便。

1周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!