尝试说一说事件的使用 
                                                    
                        
                    
                    
  
                    
                    事件驱动编程是一种编程模式,其中的程序流由诸如用户动作(鼠标点击,按键)、传感器输出或来自其他程序/线程的消息等事件来决定确定。事件驱动编程是图形用户界面和其他应用程序(例如 JavaScript Web 应用程序)中使用的主要范例,用于执行某些操作来响应用户输入。
在 Laravel 里,有些事件是由她自动发起的,例如 Model 的 create、save、 update 或者是 delete 操作时,她会分别发起相应的事件,如果我们需要,可以监听这些事件,完成不同的需求。除了她自动发起的事件,我们也可以自己定义我们需要的事件以及监听器。
在应用中使用事件,是解耦应用的好方法,比如注册一位新用户。
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 命令,创建我们需要的事件类和与之对应的监听类。
php artisan make:event UserRegistered
php artisan make:listener SendWelcomeMail --event=UserRegistered
php artisan make:listener UpdateReferrer --event=UserRegistered
接下来,不要忘记到 EventServiceProvider 里的 $listen 属性中注册事件与监听器。
protected $listen = [ 
    UserRegistered::class => [ 
        SendWelcomeMail::class, 
        UpdateReferrer::class,
    ]
];
打开 app/Events/UserRegistered.php
public $user;
public function __construct(User $user)
{
    $this->user = $user;
}
接着打开 SendWelcomeMail.php
public function handle(UserRegistered $event)
{
    if (!$event->user->email) {
        return;
    }
    Mail::to($event->user->email)->send(new Email($event->user));
}
再打开 UpdateReferrer.php
public function handle(UserRegistered $event)
{
    ...
    ...
}
可以看到,通过事件驱动,我们让 UserController 的 store 方法,变得尽可能的少,并且专注于注册用户这件事上,其他逻辑由 UserRegistered 事件的监听器来负责完成。如果有新增加的需求,可是创建一个新的监听器来完成这件事。
当完成了事件与监听器的编写与注册之后,我们可以把它放进控制器逻辑。
public function store(Request $request)
{
    ...
    ...
    ...
    \event(new UserRegistered($user));
}
我个人比较喜欢把它放在模型事件中触发,可以尝试这么写。
class User extends Model
{
    public static function boot()
    {
        parent::boot();
        static::created(function (User $user) {
            \event(new UserRegistered($user));
        });
    }
}
我觉得使用 Laravel 的事件系统,可以让我们的作品变得更优雅,逻辑条理更清晰,也更具有拓展性。让每部分代码块,都知道自己是干什么的,要干什么,不需要关注与自己无关的事儿。代码块之间分工合作,你中有我,我中有你,最终把这件事情完成好。
本作品采用《CC 协议》,转载必须注明作者和本文链接
          
                    
                    
          
          
                关于 LearnKu
              
                    
                    
                    
 
推荐文章: