前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Hyperf 初体验之事件机制(Event and Listener )

Hyperf 初体验之事件机制(Event and Listener )

作者头像
hedeqiang
修改2020-01-13 16:18:54
修改2020-01-13 16:18:54
2.4K0
举报
文章被收录于专栏:LaravelCodeLaravelCode

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

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

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

首先定义一个事件

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

代码语言:txt
复制
mkdir app/Event
代码语言:txt
复制
// app/Event/UserRegistered.php

<?php
namespace App\Event;

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

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

定义一个监听器

代码语言:txt
复制
php bin/hyperf.php gen:listener UserRegisteredListener

大概生成的文件如下:

代码语言:txt
复制
<?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 类。

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

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

代码语言:txt
复制
public function process(object $event)
{
    //发送激活邮件
    var_dump($event->user);
}

完整文件:

代码语言:txt
复制
<?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 层。

代码语言:txt
复制
<?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

代码语言:txt
复制
<?php
return [
    \App\Listener\UserRegisteredListener::class,
];

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

版权许可

本作品采用 知识共享署名 4.0 国际许可协议 进行许可。转载无需与我联系,但须注明出处,注明文章来源;

联系我
hedeqiang.png
hedeqiang.png
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首先定义一个事件
  • 定义一个监听器
  • 触发事件
  • 通过配置文件注册监听器
    • 版权许可
    • 联系我
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档