Laravel进阶系列笔记--(六)Laravel 事件监听

作者: 温新

分类: 【Laravel】

阅读: 2949

时间: 2021-08-14 13:23:30

作者:温新

时间:2021-07-07

hi,我是温新,一名PHPer。

Lravel事件使用观察者模型实现。

有这样一个场景,用户注册后发送一封邮件给用户,这时就可以用到事件监听了,监听用户注册这个动作,然后发送邮件。用到事件的场景还是比较多,因此,尽情发挥吧。

基本事件的快速使用

在本案例中,将以添加用户作为案例。这里我们模拟用户注册后将用户信息写入日志。

使用一个新的项目并保证你的数据库已连接。

第一步:定义路由

// web.php
Route::get('user/add', 'UserController@add');
Route::post('user/store', 'UserController@store');

第二步:定义控制器与方法

创建控制器

php artisan make:controller UserController

添加方法

// app/Http/Controllers/UserController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function add()
    {
        return view('user.add');
    }

    public function store(Request $request)
    {

    }
}

第三步:创建视图

文件:resources/views/user/add.php

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
</head>
<body>
<form action="{{ url('user/store') }}" method="post">
    @csrf
    用户名:<input type="text" name="name">
    邮箱:<input type="text" name="email">
    <input type="submit" value="提交">
</form>
</body>
</html>

第四步:创建用户注册事件类

php artisan make:event UserAdd

修改事件类方法

// app/Events/UserAdd.php

use App\Models\User;

public $user = null;

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

第五步:创建用户注册事件监听类

// 创建监听类并绑定事件类
php artisan make:listener UserAddLog --event=UserAdd

修改监听类

use App\Events\UserAdd;
public function handle(UserAdd $event)
{
    Log::info('用户 ' . $event->user->name . '刚刚注册了');
}

第六步:注册事件监听

文件:app/Providers/EventServiceProvider.php

use App\Events\UserAdd;
use App\Listeners\UserAddLog;
protected $listen = [
    UserAdd::class => [
        UserAddLog::class,
    ],
];

事件类UserAdd被当作了键,监听类UserAddLog被当做值;

第七步:添加数据

文件:UserController.php中的store方法

public function store(Request $request)
{
    $data = $request->except('_token');
    $data['password'] = 123456;
    $data['lover_id'] = 0;
    $user = \App\Models\User::create($data);
	 // 用户添加成功后的事件监听
    event(new UserAdd($user));
    return redirect('/user/add');
}

事件订阅者

上一篇文章中有使用到事件订阅者去监听事件,本篇继续记录。

使用事件订阅者可以在subscribe方法中定义多个事件处理器,该方法接收一个事件分发器实例。可以在该方法中使用listen方法注册事件监听器。

下面的案例编写一个监听删除用户之后的动作。

文档并没有完全的介绍,有时候看着文档就会踩坑。

需要注意的是,模型事件与Laravel事件在使用方法上是有一点不同的。上篇文章使用了订阅者来监听模型事件,本篇文章是针对Laravel事件的使用。在阅读本篇事件订阅者可以对比上篇文章的的订阅者使用,看看有哪些不同。

上篇文章使用的是删除的案例,那么这篇文章就用添加的案例。

前四个步骤是一样的,这里从第四步开始

第一步:定义路由

第二步:定义控制器与方法

第三步:创建视图

第四步:创建事件类

创建事件类

// 用户注册事件
php artisan make:event UserAddEvent
// 删除用户事件
php artisan make:event UserDeletedEvent

下面编写事件类

用户注册事件

// app/Events/UserAddEvent.php
use App\Models\User;
public $user = null;    
public function __construct(User $user)
{
    $this->user = $user;
}

用户删除事件

// app/Events/UserDeletedEvent.php
use App\Models\User;
public $user = null;
public function __construct(User $user)
{
    $this->user = $user;
}

第五步:手动创建事件订阅者

文件:app/Listeners/UserEventSubscribe.php

<?php
namespace App\Listeners;

use App\Events\UserAddEvent;
use App\Events\UserDeletedEvent;
use Illuminate\Support\Facades\Log;

class UserEventSubscribe
{
   // 用户添加后触发
    public function handleAddUser($event)
    {
        Log::info($event->user->name . '刚刚注册成为了会员');
    }

    // 删除用户后触发
    public function handleDeletedUser($event)
    {
        Log::info($event->user->name . '被删除了');
    }

    public function subscribe($event)
    {
        // 可以用此方式
        //$event->listen(
        //    'App\Events\UserAddEvent',
        //    'App\Listeners\UserEventSubscribe@handleAddUser'
        //);
        return [
            UserAddEvent::class => [
                [UserEventSubscribe::class, 'handleAddUser'],
            ],
            UserDeletedEvent::class => [
              [UserEventSubscribe::class, 'handleDeletedUser']
            ],
        ];        
    }
}

第六步:注册事件订阅者

文件:app/Providers/EventServiceProvider.php

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

第七步:测试

1)添加用于删除测试的路由与方法

// web.php
Route::get('user/delete', 'UserController@delete');
// UserController.php

public function delete()
{
    $user = \App\Models\User::find(148);
    $user->delete();
    // 删除后触发
    event(new UserDeletedEvent($user));
}

2)路由访问测试,然后打开laravel.log文件看看没有日志写入成功。

我是温新

每天进步一点点,就一点点

请登录后再评论