🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
> 事件模式是一种经过了充分测试的可靠机制,是一种非常适用于解耦的机制,用于一个方法内部的复杂程序的解耦 [TOC] ## 安装组件 ~~~ composer require hyperf/event ~~~ ## 定义一个事件 ~~~ namespace App\Event; class UserRegistered { // 建议这里定义成 public 属性,以便监听器对该属性的直接使用,或者你提供该属性的 Getter public $uid; public function __construct($uid) { $this->uid = $uid; } } ~~~ ## 定义一个监听器 ~~~ namespace App\Listener; use App\Event\UserRegistered; use Hyperf\Event\Annotation\Listener; use Hyperf\Event\Contract\ListenerInterface; /** * @Listener */ class UserRegisteredListener implements ListenerInterface { public function listen(): array { // 返回一个该监听器要监听的事件数组,可以同时监听多个事件 return [ UserRegistered::class, ]; } /** * @param UserRegistered $event */ public function process(object $event) { // 事件触发后该监听器要执行的代码写在这里,比如该示例下的发送用户注册成功短信等 // 直接访问 $event 的 uid 属性获得事件触发时传递的参数值 echo 'listener process user:'.$event->uid; } } ~~~ ## 方法内部解耦(触发事件) ~~~ namespace App\Service; use Hyperf\Di\Annotation\Inject; use Psr\EventDispatcher\EventDispatcherInterface; use App\Event\UserRegistered; class UserService { /** * @Inject * @var EventDispatcherInterface */ private $eventDispatcher; public function register() { // 我们假设存在 User 这个实体 $uid = 55; // 完成账号注册的逻辑 // 这里 dispatch(object $event) 会逐个运行监听该事件的监听器 $this->eventDispatcher->dispatch(new UserRegistered($uid)); return true; } } ~~~ ## Controller 调用测试 ~~~ declare(strict_types=1); namespace App\Controller; use Hyperf\Di\Annotation\Inject; use Hyperf\HttpServer\Annotation\AutoController; /** * @AutoController() */ class IndexController extends AbstractController { /** * @Inject() * @var \App\Service\UserService */ public $userService; public function test2() { $result = $this->userService->register(); return $result; } } ~~~