Laravel - 事件处理

你好啊,未来的 Laravel 巫师们!今天,我们将一起探索 Laravel 中事件处理的神奇世界。如果你是编程新手,不用担心——我会像过去几年里指导无数学生一样,一步步引导你。所以,拿起你最喜欢的饮料,让我们一起踏上这个激动人心的冒险之旅!

Laravel - Event Handling

Laravel 中的事件是什么?

想象你在一个派对上(当然是一个代码派对!)。当发生了一些重要的事情——比如蛋糕到来时——每个人都会兴奋起来。在 Laravel 中,事件就像是应用中这些令人兴奋的时刻。它们是你应用关心的特殊事件。

例如,当用户在你的网站上注册时,这就是一个事件。当有人下单时,这也是一个事件。事件帮助我们保持代码的组织性,并允许应用的不同部分对这些重要时刻做出反应。

为什么使用事件?

  1. 解耦:事件帮助分离应用的不同部分。就像工作中的不同团队——每个团队不需要知道其他团队所做的所有事情。

  2. 灵活性:你可以轻松地为事件添加新的反应,而无需更改现有代码。

  3. 清晰性:事件使代码更易于理解。发生的事情及其发生的时间都很清晰。

创建你的第一个事件

让我们一起创建我们的第一个事件。我们将创建一个在用户注册时发生的事件。下面是如何操作:

php artisan make:event NewUserRegistered

这个命令在 app/Events 中创建了一个名为 NewUserRegistered.php 的新文件。让我们看看里面:

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class NewUserRegistered
{
use Dispatchable, InteractsWithSockets, SerializesModels;

public $user;

public function __construct($user)
{
$this->user = $user;
}

public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}

不要被所有的代码吓到!这就像一个食谱——我们会逐一了解每个成分:

  • 顶部的 use 语句就像是我们可能需要的工具。
  • 我们的 NewUserRegistered 事件类是魔法发生的地方。
  • $user 属性将持有新用户的信息。
  • __construct 方法在我们创建这个事件时被调用,并存储用户信息。

触发(调度)事件

现在我们有了事件,让我们使用它!当新用户注册时,我们会触发这个事件。下面是如何在一个控制器中做到这一点:

use App\Events\NewUserRegistered;

public function register(Request $request)
{
// ... 用户注册逻辑 ...

$user = User::create($request->all());

event(new NewUserRegistered($user));

return redirect('/welcome');
}

在这里,在我们创建一个新用户之后,我们使用 event() 函数触发我们的事件。就像为庆祝新用户而放烟火一样!

监听事件

现在,让我们创建一个监听器来响应我们的事件。想象这个人是派对上负责在蛋糕到来时分发派对帽子的人。

首先,让我们创建一个监听器:

php artisan make:listener SendWelcomeEmail --event=NewUserRegistered

这会在 app/Listeners 中创建一个名为 SendWelcomeEmail.php 的新文件。让我们看看里面:

<?php

namespace App\Listeners;

use App\Events\NewUserRegistered;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;

class SendWelcomeEmail
{
public function handle(NewUserRegistered $event)
{
// 使用 $event->user 访问用户
// 在这里编写发送欢迎邮件的逻辑
}
}

handle 方法是我们放置事件发生时应运行的代码的地方。在这个例子中,我们会放入发送欢迎邮件的逻辑。

注册事件监听器

为了将我们的事件与监听器连接起来,我们需要注册它们。打开 app/Providers/EventServiceProvider.php 并在 $listen 数组中添加以下内容:

protected $listen = [
NewUserRegistered::class => [
SendWelcomeEmail::class,
],
];

这告诉 Laravel:“当 NewUserRegistered 发生时,运行 SendWelcomeEmail!”

事件订阅者

有时,你可能希望一个类处理多个事件。这时事件订阅者就派上用场了。它们就像是负责派对多个方面的派对策划人。

下面是如何创建一个事件订阅者:

php artisan make:listener UserEventSubscriber

然后,在 UserEventSubscriber 类中:

<?php

namespace App\Listeners;

class UserEventSubscriber
{
public function handleUserRegistered($event) {}

public function handleUserLoggedIn($event) {}

public function subscribe($events)
{
$events->listen(
'App\Events\NewUserRegistered',
'App\Listeners\UserEventSubscriber@handleUserRegistered'
);

$events->listen(
'App\Events\UserLoggedIn',
'App\Listeners\UserEventSubscriber@handleUserLoggedIn'
);
}
}

要注册这个订阅者,将其添加到 EventServiceProvider 中的 $subscribe 属性:

protected $subscribe = [
'App\Listeners\UserEventSubscriber',
];

队列事件监听器

如果你的事件监听器正在做一些耗时的操作(比如发送邮件),你可能希望将其排队,这样就不会减慢你的应用。就像告诉某人:“嘿,你可以稍后处理这个任务,当你不那么忙的时候。”

要使监听器可排队,实现 ShouldQueue 接口:

use Illuminate\Contracts\Queue\ShouldQueue;

class SendWelcomeEmail implements ShouldQueue
{
// ...
}

现在,Laravel 会自动将这个监听器排队!

事件方法表

以下是我们在事件中使用的主要方法的便捷表格:

方法 描述
event() 调度一个事件
listen() 注册一个事件监听器
subscribe() 注册一个事件订阅者
dispatch() 另一种调度事件的方式
broadcast() 广播一个事件(用于实时应用)

亲爱的学生们,以上就是我们一起穿越 Laravel 事件处理领域的旅程。记住,熟能生巧,所以不要害怕在你们自己的项目中尝试这些概念。谁知道呢?你可能只用你新学的事件处理技能就举办了一个最棒的代码派对!

快乐编码,愿你的事件总是以优雅和风格处理!

Credits: Image by storyset