服务构造函数中的OnDispatch事件

问题描述 投票:0回答:1

我在 Apigility 中附加

OnDispatch
事件时遇到问题。我希望从抽象服务类的构造函数中的自定义标头中获取值。当我简单地将它添加到 Module.php
 中的引导程序时,它
有效

public function onBootstrap(MvcEvent $e)
{
    $eventManager        = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
    $eventManager->attach(\Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'onDispatch'));
}

public function onDispatch(\Zend\Mvc\MvcEvent $e){
    $e->getRequest()->getHeaders()->get('User-Token')->getFieldValue();
}

但是我不知道如何将这个值传递给ServiceAbstract构造函数。

我还尝试实现

EventManagerAwareInterface
并使用
attachDefaultListeners()
方法附加事件,但这没有给我任何结果 - 未调用附加函数。附加到不在控制器中的事件的正确方法是什么?感谢您的帮助。

php zend-framework2 laminas-api-tools
1个回答
2
投票

在我看来,你在这里有两个不同的目标。

1. 存储来自路由事件的标头变量。

2. 获取类构造函数的依赖关系

回答1。

您可以创建一个侦听器类并将该类附加到您的

EventManager
。这看起来像这样:

<?php

namespace My\Listener;

use Zend\EventManager\ListenerAggregateInterface;
use Zend\EventManager\EventManagerInterface;
use Zend\Mvc\MvcEvent;
use Zend\Http\Headers;
use Zend\Http\Request as HttpRequest;

class MyCustomListener implements ListenerAggregateInterface
{
    /**
     * @var \Zend\Stdlib\CallbackHandler[]
     */
    protected $listeners = array();

    /**
     * @param EventManagerInterface $eventManager
     */
    public function attach(EventManagerInterface $eventManager)
    {
        // attach on route
        $this->listeners[] = $eventManager->attach(MvcEvent::EVENT_DISPATCH, array($this, 'onDispatch'));
    }

    /**
     * @param EventManagerInterface $eventManager
     */
    public function detach(EventManagerInterface $eventManager)
    {
        foreach ($this->listeners as $index => $listener) {
            if ($eventManager->detach($listener)) {
                unset($this->listeners[$index]);
            }
        }
    }

    /**
     * Do your thing on dispatch event with your headers
     *
     * @param MvcEvent $event
     */
    public function onDispatch(MvcEvent $event)
    {
        $request = $event->getRequest();
        if(!$request instanceof HttpRequest){
            // Nothing to do
            return;
        }

        $headers = $request->getHeaders();

        // You could for example get a service here and store your value
    }
}

您可以像这样在

Module.php
中附加此侦听器:

public function onBootstrap(MvcEvent $event)
{
    $event->getApplication();
    $application->getEventManager();
    $eventManager->attach($serviceManager->get('My\Listener\MyCustomListener'));
}

您必须使用

ServiceManager
键在
invokables
下的
factories
My\Listener\MyCustomListener
下注册监听器,才能将其附加到此处。

回答2:

要在构造函数中获取依赖项,您可以为您的类创建一个工厂,并从服务获取依赖项,该服务可以提供您需要的依赖项(可以直接来自 1 的侦听器)。

<?php
namespace My\Factory;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use My\Folder\MyCustomClass;

class MyClassFactory implements FactoryInterface
{
    /**
     * @param  ServiceLocatorInterface $serviceLocator
     * @return Logger
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $controllerPluginManager = $serviceLocator;
        $service = $serviceManager->get(My\Service\MyStorageService);
        $dependency = $service->getDependency();
        return new MyCustomClass($dependency);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.