2

我正在尝试为 Laminas 框架添加事件,该事件将在触发\Laminas\Mvc\MvcEvent::EVENT_DISPATCH 时触发。但绝对没有任何事情发生,就像这个触发器不存在一样。我究竟做错了什么?

这是module\Application\src\Module.php下的代码:

use Laminas\ModuleManager\ModuleManager;
use Laminas\Mvc\MvcEvent;

class Module
{
    public function init(ModuleManager $moduleManager)
    {
        ini_set("display_errors", '1');
        $eventManager = $moduleManager->getEventManager();
        $eventManager->attach(MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch']);
    }

    public function onDispatch(\Laminas\EventManager\Event $event)
    {
        var_dump('ok');die;
    }
}
4

2 回答 2

3

我认为你需要使用另一种方法,Module它应该是这样的:

use Laminas\Mvc\MvcEvent;

class Module
{
    public function onBootstrap(MvcEvent $event)
    {
        $application = $event->getApplication();
        $eventManager = $application->getEventManager();

        $eventManager->attach(MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch']);
    }

    public function onDispatch(MvcEvent $event)
    {
        var_dump('ok');
        die;
    }
}

在这种情况下onBootstrap。希望能帮到你

于 2021-09-17T15:35:25.670 回答
2

在初始化时,您需要从模块管理器中获取共享事件管理器:

<?php

use Laminas\ModuleManager\Feature\InitProviderInterface;
use Laminas\ModuleManager\ModuleManagerInterface;
use Laminas\Mvc\Application;
use Laminas\Mvc\MvcEvent;

final class Module implements InitProviderInterface
{

    public function init(ModuleManagerInterface $manager): void
    {
        $sharedEventManager = $manager->getEventManager()->getSharedManager();
        $sharedEventManager->attach(
            Application::class,
            MvcEvent::EVENT_DISPATCH,
            function () {
                var_Dump('dispatch from init');
            }
        );
    }

}

通常SharedEventManager(或应该)在所有事件管理器实例之间共享。这使得从其他事件管理器实例调用或创建事件成为可能。为了区分事件名称,使用了一个标识符(因此您可以拥有多个具有相同名称的事件)。所有 MvcEvents 都属于该Laminas\Mvc\Application标识符。Laminas\ModuleManager\ModuleManager有它自己的 EventManager 实例,这就是为什么您需要将事件添加到 SharedEventManager (init()由 ModuleManager 调用并被Laminas\ModuleManager\ModuleEvent使用)。

onBootstrap()将被 调用Laminas\Mvc\Application,这就是为什么您在那里获得正确的 EventManager 实例的原因。

正如@Dimitry 建议的那样:您应该添加该事件,onBootstrap()因为调度过程是应用程序的一部分,而不是模块管理器。在init()你应该只添加引导事件。

顺便说一句:您应该使用Laminas\ModuleManager\Feature\*接口使您的应用程序对未来的更新更加健壮。

于 2021-09-23T09:27:42.640 回答