关于事件的描述就不介绍了,直接看 官方文档 事件机制
下面说下具体如何使用。事件的用处还是非常多的。比如用户注册成功 发送一份激活邮件、或者第三方支付返回支付回调 我们也可以使用事件.....
假如我们有一个用户注册的例子,注册成功发送激活邮件。那么使用事件该如何实现呢?(当然我不会真实发生邮件,只是说事件的具体用法)
一个事件其实就是一个用于管理状态数据的普通类,触发时将应用数据传递到事件里,然后监听器对事件类进行操作,一个事件可被多个监听器监听。
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,
];
关于更多注意事项之类的 我想你还是去查阅 官网文档
本作品采用 知识共享署名 4.0 国际许可协议 进行许可。转载无需与我联系,但须注明出处,注明文章来源;