我在 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()
方法附加事件,但这没有给我任何结果 - 未调用附加函数。附加到不在控制器中的事件的正确方法是什么?感谢您的帮助。
在我看来,你在这里有两个不同的目标。
1. 存储来自路由事件的标头变量。
2. 获取类构造函数的依赖关系
您可以创建一个侦听器类并将该类附加到您的
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
下注册监听器,才能将其附加到此处。
要在构造函数中获取依赖项,您可以为您的类创建一个工厂,并从服务获取依赖项,该服务可以提供您需要的依赖项(可以直接来自 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);
}
}