首页 > PHP > Laravel教程 事件系统

Laravel教程 事件系统

2025-03-01 13:57:37

Laravel 事件系统提供了一种简单的观察者模式实现,允许你在应用程序中触发和监听事件。以下是一个详细的 Laravel 事件系统教程:

1. 环境准备

确保你已经安装了 Laravel 框架。如果还未安装,可以使用 Composer 进行安装:

composer create-project --prefer-dist laravel/laravel event-demo
cd event-demo

2. 生成事件和监听器

Laravel 提供了 Artisan 命令来快速生成事件和监听器类。

生成事件类

使用以下命令生成一个事件类:

php artisan make:event UserRegistered

这将在 app/Events 目录下创建一个 UserRegistered.php 文件,内容大致如下:

<?php

namespace App\Events;

use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class UserRegistered
{
    use Dispatchable, SerializesModels;

    public $user;

    /**
     * Create a new event instance.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function __construct($user)
    {
        $this->user = $user;
    }
}
 

生成监听器类

使用以下命令生成一个对应的监听器类:

php artisan make:listener SendWelcomeEmail --event=UserRegistered

这将在 app/Listeners 目录下创建一个 SendWelcomeEmail.php 文件,内容大致如下:

<?php

namespace App\Listeners;

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

class SendWelcomeEmail
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  \App\Events\UserRegistered  $event
     * @return void
     */
    public function handle(UserRegistered $event)
    {
        // 这里可以编写发送欢迎邮件的逻辑
        $user = $event->user;
        // 示例:简单打印用户信息
        echo "Sending welcome email to {$user->email}";
    }
}

3. 注册事件和监听器

在 app/Providers/EventServiceProvider.php 文件中注册事件和监听器。打开该文件,找到 $listen 属性,将事件和监听器关联起来:

<?php

namespace App\Providers;

use App\Events\UserRegistered;
use App\Listeners\SendWelcomeEmail;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        UserRegistered::class => [
            SendWelcomeEmail::class,
        ],
    ];

    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        parent::boot();

        //
    }
}

4. 触发事件

在控制器或其他服务中触发事件。以下是一个简单的控制器示例:

<?php

namespace App\Http\Controllers;

use App\Events\UserRegistered;
use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function register(Request $request)
    {
        // 创建新用户
        $user = User::create([
            'name' => $request->input('name'),
            'email' => $request->input('email'),
            'password' => bcrypt($request->input('password')),
        ]);

        // 触发事件
        event(new UserRegistered($user));

        return response()->json(['message' => 'User registered successfully']);
    }
}

5. 路由配置

在 routes/api.php 中添加路由:

use App\Http\Controllers\UserController;

Route::post('/register', [UserController::class, 'register']);

6. 测试事件系统

启动 Laravel 开发服务器:

php artisan serve

使用 Postman 或其他工具发送 POST 请求到 http://127.0.0.1:8000/api/register,并在请求体中包含用户信息:

{
    "name": "John Doe",
    "email": "johndoe@example.com",
    "password": "password123"
}

当请求成功时,你应该会看到控制台输出 Sending welcome email to johndoe@example.com

7. 队列监听器

如果你希望监听器在队列中异步执行,可以让监听器实现 ShouldQueue 接口:

<?php

namespace App\Listeners;

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

class SendWelcomeEmail implements ShouldQueue
{
    use InteractsWithQueue;

    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  \App\Events\UserRegistered  $event
     * @return void
     */
    public function handle(UserRegistered $event)
    {
        $user = $event->user;
        echo "Sending welcome email to {$user->email}";
    }
}

然后启动队列工作器:

php artisan queue:work

通过以上步骤,你就可以在 Laravel 应用程序中使用事件系统来解耦业务逻辑,提高代码的可维护性和可扩展性。

使用 Ctrl+D 可将网站添加到书签
收藏网站
扫描二维码
关注早实习微信公众号
官方公众号
Top