关于事件的描述就不介绍了,直接看 官方文档 事件机制

下面说下具体如何使用。事件的用处还是非常多的。比如用户注册成功 发送一份激活邮件、或者第三方支付返回支付回调 我们也可以使用事件.....

假如我们有一个用户注册的例子,注册成功发送激活邮件。那么使用事件该如何实现呢?(当然我不会真实发生邮件,只是说事件的具体用法)

首先定义一个事件

一个事件其实就是一个用于管理状态数据的普通类,触发时将应用数据传递到事件里,然后监听器对事件类进行操作,一个事件可被多个监听器监听。

mkdir app/Event
// app/Event/UserRegistered.php

<?php
namespace App\Event;

class UserRegistered
{
    // 建议这里定义成 public 属性,以便监听器对该属性的直接使用,或者你提供该属性的 Getter
    public $user;

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

定义一个监听器

php bin/hyperf.php gen:listener UserRegisteredListener

大概生成的文件如下:

<?php

declare(strict_types=1);

namespace App\Listener;

use Hyperf\Event\Annotation\Listener;
use Psr\Container\ContainerInterface;
use Hyperf\Event\Contract\ListenerInterface;

/**
 * @Listener
 */
class UserRegisteredListener implements ListenerInterface
{
    /**
     * @var ContainerInterface
     */
    private $container;

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

    public function listen(): array
    {
        return [
        ];
    }

    public function process(object $event)
    {
    }
}

listen() 监听具体的事件 也就是我们刚才添加的 UserRegistered 类。

public function listen(): array
{
    // 返回一个该监听器要监听的事件数组,可以同时监听多个事件
    return [
        UserRegistered::class,
    ];
}

process 方法则为我们具体的业务逻辑,比如我们要发送激活邮件

public function process(object $event)
{
    //发送激活邮件
    var_dump($event->user);
}

完整文件:

<?php

declare(strict_types=1);

namespace App\Listener;

use App\Event\UserRegistered;
use Hyperf\Event\Annotation\Listener;
use Psr\Container\ContainerInterface;
use Hyperf\Event\Contract\ListenerInterface;

/**
 * @Listener
 */
class UserRegisteredListener implements ListenerInterface
{
    /**
     * @var ContainerInterface
     */
    private $container;

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

    public function listen(): array
    {
        return [
            UserRegistered::class,
        ];
    }

    public function process(object $event)
    {
        //发送激活邮件
        var_dump($event->user);
    }
}

触发事件

我这里为了方便演示 直接在控制器中添加了,实际上你应该像 Hyperf 官方文档列出来的一样 抽离成 Service 层。

<?php

declare(strict_types=1);

namespace App\Controller;

use App\Event\UserRegistered;
use Hyperf\Di\Annotation\Inject;
use Psr\EventDispatcher\EventDispatcherInterface;

class IndexController extends AbstractController
{
    /**
     * @Inject()
     * @var EventDispatcherInterface
     */
    private $eventDispatcher;

    public function index()
    {
        // 假设 $user 为我们注册的用户
        $user = ['id' => 1,'email' =>'gmail.com'];
        $this->eventDispatcher->dispatch(new UserRegistered($user)); //触发事件
        return [
            'name' => 'Hyperf'
        ];
    }
}

ok,以上就是 Hyperf 事件处理器的使用方式,其实文档写的已经非常全了,我只不过是照搬过来而已。让你自己走一遍流程记忆更加深刻而已。勿喷....

通过配置文件注册监听器

直接通过命令行生成 监听器,默认会为我们配置 @Listener 注解,我们也可以通过配置文件注册监听器 config/autoload/listeners.php

<?php
return [
    \App\Listener\UserRegisteredListener::class,
];

关于更多注意事项之类的 我想你还是去查阅 官网文档

关于极客返利

极客返利 是由我个人开发的一款网课返利、返现平台。包含 极客时间返现、拉勾教育返现、掘金小册返现、GitChat返现。目前仅包含这几个平台。后续如果有需要可以考虑其他平台。 简而言之就是:你买课,我返现。让你花更少的钱,就可以买到课程。

https://geek.laravelcode.cn

https://geek.idaka.ink

版权许可

本作品采用 知识共享署名 4.0 国际许可协议 进行许可。

转载无需与我联系,但须注明出处,注明文章来源 Hyperf 初体验之事件机制(Event and Listener )

联系我

编程怪事
暂无回复
0 / 180