Добавление событий в слои

#php #zend-framework3 #laminas-api-tools #laminas

Вопрос:

Я пытаюсь добавить событие для платформы Laminas, которое запустится при запуске LaminasMvcMvcEvent::EVENT_DISPATCH. Но абсолютно ничего не происходит, как будто этого триггера не существует. Что я делаю не так?

Это код в соответствии с moduleApplicationsrcModule.php:

 use LaminasModuleManagerModuleManager;
use LaminasMvcMvcEvent;

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(LaminasEventManagerEvent $event)
    {
        var_dump('ok');die;
    }
}
 

Ответ №1:

Я думаю, вам нужно использовать другой метод, в Module нем должно быть что-то вроде этого:

 use LaminasMvcMvcEvent;

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 . Надеюсь помочь вам

Ответ №2:

При запуске вам нужно будет получить диспетчер общих событий из диспетчера модулей:

 <?php

use LaminasModuleManagerFeatureInitProviderInterface;
use LaminasModuleManagerModuleManagerInterface;
use LaminasMvcApplication;
use LaminasMvcMvcEvent;

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 принадлежат LaminasMvcApplication идентификатору. LaminasModuleManagerModuleManager имеет свой собственный экземпляр EventManager, поэтому вам нужно будет добавить событие в SharedEventManager ( init() вызывается менеджером модулей и LaminasModuleManagerModuleEvent используется).

onBootstrap() будет вызван LaminasMvcApplication , поэтому вы получите там правильный экземпляр EventManager.

Как предложил @Dimitry: вы должны добавить это событие, onBootstrap() поскольку процесс отправки является частью приложения, а не менеджера модулей. В init() вы должны добавлять только события начальной загрузки.

И кстати: вы должны использовать LaminasModuleManagerFeature* интерфейсы, чтобы сделать ваше приложение немного более устойчивым к будущим обновлениям.