Php 触发新事件并侦听它
我正在看一本书,书中展示了如何触发一个新事件并开始聆听它。该事件称为channel-25,它只包含用于测试的虚构数据。我放置了错误日志来捕获事件进程,以便了解其工作情况。事件确实会被触发,但由于某些原因,我无法收听。这是module.php的副本 我已经对该部分进行了评论,指出我在哪里触发了偶数,以及我在哪里听到了偶数Php 触发新事件并侦听它,php,zend-framework2,Php,Zend Framework2,我正在看一本书,书中展示了如何触发一个新事件并开始聆听它。该事件称为channel-25,它只包含用于测试的虚构数据。我放置了错误日志来捕获事件进程,以便了解其工作情况。事件确实会被触发,但由于某些原因,我无法收听。这是module.php的副本 我已经对该部分进行了评论,指出我在哪里触发了偶数,以及我在哪里听到了偶数 <?php namespace Debug; use Zend\ModuleManager\Feature\AutoloaderProviderInterface; u
<?php
namespace Debug;
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\Mvc\ModuleRouteListener;
use Zend\ModuleManager\ModuleManager;
use Zend\eventManager\Event;
use Zend\Mvc\MvcEvent;
use Zend\EventManager\EventManager; //manage events (create/listen for events)
class Module implements AutoloaderProviderInterface
{
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}
public function init(ModuleManager $ModuleManager)
{
$eventManager = $ModuleManager->getEventManager();
$eventManager->attach('loadModules.post', array($this, 'loadedModulesInfo'));
//create new event
$event = new EventManager('channel-25');
$event->trigger('new song', null, array('artist' => 'Adele'));
error_log('New Event Triggered');
}
public function loadedModulesInfo(Event $event)
{
$moduleManager = $event->getTarget();
$loadedModules = $moduleManager->getLoadedModules();
error_log(var_export($loadedModules, true));
}
public function onBootstrap(MvcEvent $event)
{
//Now i will be listening for my sample event
$eventManager = $event->getApplication()->getEventManager();
$sharedEventManager = $eventManager->getSharedManager();
$sharedEventManager->attach('channel-25', 'new song', function(Event $event) {
$artist = $event->getParam('artist');
error_log('Found the Event. The artist is: ' . $artist);
});
}
public function handleError(MvcEvent $event)
{
$controller = $event->getController();
$error = $event->getParam('error');
$exception = $event->getParam('exception');
$message = 'Error: ' . $error;
if($exception instanceof \Exception)
{
$message .= ', Exception(' . $exception->getMessage() . '):' . $exception->getTraceAsString();
}
error_log($message);
}
}
我想出来了。我将事件触发器移动到索引控制器,它就工作了。 对于其他试图了解事件的人,我就是这么做的: indexController.php
namespace Debug\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\Mvc\MvcEvent;
use Zend\EventManager\EventManager;
class IndexController extends AbstractActionController
{
public function indexAction()
{
//create new event
$event = new EventManager('channel-25');
$event->trigger('new song', null, array('artist' => 'Adele'));
error_log('New Event Triggered');
}
}
Module.php
<?php
namespace Debug;
use Zend\ModuleManager\ModuleManager;
use Zend\eventManager\Event;
use Zend\Mvc\MvcEvent;
class Module
{
public function onBootstrap(MvcEvent $event)
{
//Now i will be listening for my sample event
$eventManager = $event->getApplication()->getEventManager();
$sharedEventManager = $eventManager->getSharedManager();
$sharedEventManager->attach('channel-25', 'new song', function(Event $event) {
$artist = $event->getParam('artist');
error_log('got the new song: ' . $artist);
});
}
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}
}
我可以看出您自己找到了解决方案。代码不起作用的原因是您在开始侦听之前触发了事件。在您的第二篇文章中,事件的触发是在已经有侦听器之后完成的。这是正确的顺序
--
附言:如果有人对学习Zend Framework 2感兴趣,你可以试试