注册成功后通过thinkphp事件系统解耦欢迎邮件、日志记录与第三方同步,需定义userregistered事件类并继承thinkevent,监听器handle方法按public属性名接收参数,在event.php静态绑定或appserviceprovider中动态注册并设置优先级,最后用event::trigger触发。

要在用户注册成功后自动发送欢迎邮件、记录操作日志、同步第三方平台,又不想把这三段代码全塞进注册控制器里——得用ThinkPHP事件系统把它们从主流程中彻底剥离开,让注册逻辑干净、可测、不因新增需求而反复修改。
创建标准事件类
在命令行执行:php think make:event UserRegistered,自动生成 app/event/UserRegistered.php 文件。
打开该文件,必须继承 hinkEvent 基类,否则监听器永远不会触发且无任何报错提示。删掉默认生成的类定义,重写为:
```php
namespace appevent;
use thinkEvent;
class UserRegistered extends Event
{
public $user;
public $ip;
public function __construct($user, $ip = '')
{
$this->user = $user;
$this->ip = $ip;
}
}
注意:public 属性名将直接作为监听器 handle() 方法的参数名,拼错一个字母就失效。
生成并编写监听器
运行命令:php think make:listener SendWelcomeEmail,生成 app/listener/SendWelcomeEmail.php。
编辑该文件,在 handle() 方法中接收事件属性,不要写构造函数——监听器默认不走容器注入,依赖需手动获取:
```php
namespace applistener;
use appeventUserRegistered;
use thinkMail;
class SendWelcomeEmail
{
public function handle($user, $ip)
{
// 依赖服务必须用 app() 主动获取,不能靠构造注入
$mail = app()->make(Mail::class);
$mail->to($user->email)->send("欢迎注册,您的IP是 {$ip}");
}
}
绑定事件与监听器
方法一:在 app/event.php 配置文件中静态绑定(推荐用于稳定模块)
返回数组,键为事件类完整命名空间,值为监听器类全限定名数组:
```php
return [
'app\event\UserRegistered' => [
'app\listener\SendWelcomeEmail',
'app\listener\LogUserRegister',
'app\listener\SyncToThirdParty',
],
];
方法二:在 app/Providers/AppServiceProvider.php 的 boot() 方法中动态注册(适合需设优先级或条件启用的场景)
```php
use thinkEvent;
Event::listen('app\event\UserRegistered', 'app\listener\SendWelcomeEmail', 90);
Event::listen('app\event\UserRegistered', 'app\listener\LogUserRegister', 50);
Event::listen('app\event\UserRegistered', 'app\listener\SyncToThirdParty', -10);
优先级数值越大越先执行,比如日志记录应早于发邮件(防止邮件失败导致日志漏记),而同步第三方建议设为负值,避免阻塞主流程响应。
在业务中触发事件
第一步:在用户注册成功的控制器方法末尾,确认已获取到完整用户模型实例(如 $user = User::create([...]));
第二步:调用 Event::trigger(),传入事件类名和事件构造所需参数数组:
```php
use thinkEvent;
use appeventUserRegistered;
Event::trigger(UserRegistered::class, [$user, $request->ip()]);
注意:第二个参数必须是索引数组,顺序严格对应事件类中 public 属性声明顺序;若传关联数组或键名不匹配,handle() 将收不到值且静默跳过。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











