Laravel 事件系统提供了一种简单的观察者模式实现,允许你在应用程序中触发和监听事件。以下是一个详细的 Laravel 事件系统教程:
确保你已经安装了 Laravel 框架。如果还未安装,可以使用 Composer 进行安装:
composer create-project --prefer-dist laravel/laravel event-demo
cd event-demo
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}";
}
}
在 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();
//
}
}
在控制器或其他服务中触发事件。以下是一个简单的控制器示例:
<?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']);
}
}
在 routes/api.php
中添加路由:
use App\Http\Controllers\UserController;
Route::post('/register', [UserController::class, 'register']);
启动 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
。
如果你希望监听器在队列中异步执行,可以让监听器实现 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 应用程序中使用事件系统来解耦业务逻辑,提高代码的可维护性和可扩展性。