前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在 Laravel 中使用 Event 特性优化代码结构

在 Laravel 中使用 Event 特性优化代码结构

作者头像
overtrue
发布2019-04-25 15:04:10
6840
发布2019-04-25 15:04:10
举报

事件驱动编程是一种编程模式,其中的程序流由诸如用户动作(鼠标点击,按键)、传感器输出或来自其他程序/线程的消息等事件来决定确定。事件驱动编程是图形用户界面和其他应用程序(例如 JavaScript Web 应用程序)中使用的主要范例,用于执行某些操作来响应用户输入。

在 Laravel 里,有些事件是由她自动发起的,例如 Model 的 create、save、 update 或者是 delete 操作时,她会分别发起相应的事件,如果我们需要,可以监听这些事件,完成不同的需求。除了她自动发起的事件,我们也可以自己定义我们需要的事件以及监听器。

在应用中使用事件,是解耦应用的好方法,比如注册一位新用户。

代码语言:javascript
复制
Class UserController extends Controller{    public function store(Request $request)    {        $this->validate($request, [            'name' => 'required',            ...            ...        ]);
        $user = User::create($request->all());
        // 欢迎邮件        if ($user->email) {            Mail::to($user->email)->send(new Email($user));        }
        // 推荐注册逻辑        if ($request->get('invite_code')) {            ...            ...        }
        // 通知运营        $user->notify(new NewUser($user));
        // 各种各样的需求        ...        ...
        return Auth::login($user);    }}

在这个用户注册方法中,耦合了各种各样的逻辑,各种各样的需求,如果还要加一些奇怪的需求,这个方法就会越来越大,越来越长。

方法的关注点应该只有注册用户到应用中,它不应该关心其他逻辑。

这里我们通过 Laravel 的 artisan 命令,创建我们需要的事件类和与之对应的监听类。

代码语言:javascript
复制
php artisan make:event UserRegistered
php artisan make:listener SendWelcomeMail --event=UserRegistered
php artisan make:listener UpdateReferrer --event=UserRegistered

接下来,不要忘记到 EventServiceProvider 里的 $listen 属性中注册事件与监听器。

代码语言:javascript
复制
protected $listen = [     UserRegistered::class => [         SendWelcomeMail::class,         UpdateReferrer::class,    ]];

打开 app/Events/UserRegistered.php

代码语言:javascript
复制
public $user;
public function __construct(User $user){    $this->user = $user;}

接着打开 SendWelcomeMail.php

代码语言:javascript
复制
public function handle(UserRegistered $event){    if (!$event->user->email) {        return;    }
    Mail::to($event->user->email)->send(new Email($event->user));}

再打开 UpdateReferrer.php

代码语言:javascript
复制
public function handle(UserRegistered $event){    ...    ...}

可以看到,通过事件驱动,我们让 UserController 的 store 方法,变得尽可能的少,并且专注于注册用户这件事上,其他逻辑由 UserRegistered 事件的监听器来负责完成。如果有新增加的需求,可是创建一个新的监听器来完成这件事。

当完成了事件与监听器的编写与注册之后,我们可以把它放进控制器逻辑。

代码语言:javascript
复制
public function store(Request $request){    ...    ...    ...
    \event(new UserRegistered($user));}

我个人比较喜欢把它放在模型事件中触发,可以尝试这么写。

代码语言:javascript
复制
class User extends Model{    public static function boot()    {        parent::boot();
        static::created(function (User $user) {            \event(new UserRegistered($user));        });    }}

我觉得使用 Laravel 的事件系统,可以让我们的作品变得更优雅,逻辑条理更清晰,也更具有拓展性。让每部分代码块,都知道自己是干什么的,要干什么,不需要关注与自己无关的事儿。代码块之间分工合作,你中有我,我中有你,最终把这件事情完成好。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 假装我会写代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档