#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*
интерфейсы, чтобы сделать ваше приложение немного более устойчивым к будущим обновлениям.