1

我需要在 zf3 应用程序的 Module.php onBootstrap 方法中获取已调度请求的模块名称。使用以前的版本(在 Zend 命名空间下),我可以通过使用共享事件管理器来做到这一点,如下所述。

public function onBootstrap(MvcEvent $e)
{
    $app = $e->getApplication();
    $eventManager = $app->getEventManager();
    $sharedEventManager = $eventManager->getSharedManager();
    $sharedEventManager->attach(AbstractActionController::class, MvcEvent::EVENT_DISPATCH, function($e) {
        $controller = $e->getTarget();
        $controllerClass = get_class($controller);
        $moduleName = strtolower(substr($controllerClass, 0, strpos($controllerClass, '\\')));
        
        // rest of code
        // ..................
        // ..................

    }, 100);
}

但是对于较新版本的框架(位于 Laminas 命名空间下),它无法正常工作。它甚至没有听目标类MvcEvent::EVENT_DISPATCH的。AbstractActionController::class我可以发现他们已经根据下面的链接删除了 SharedEventManager 功能。

https://docs.laminas.dev/laminas-eventmanager/migration/removed/#sharedeventmanagerawareinterface

那么问题来了,如何在新版框架的 onBootstrap 方法中获取分派请求的模块名呢?是否有任何解决方法来获取模块名称?

4

1 回答 1

0

我不知道这是否有助于在我使用的 Laminas 的侦听器中获取控制器和模块。

在我的 module.php 引导方法中:

$eventManager = $event->getApplication()->getEventManager();
$eventManager->attach(\Laminas\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'onDispatch'), -100);

在 onDispatch 方法中:

public function onDispatch(\Laminas\EventManager\EventInterface $event)
{
    $routeMatch = $event->getRouteMatch();
    $controller = get_class($event->getTarget());
    list($module) = explode("\\", $controller);
}

我希望这能为您指明正确的方向。

于 2021-01-13T15:47:39.427 回答