2010-02-17 13:54:36 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Symfony\Foundation\Debug;
|
|
|
|
|
|
|
|
use Symfony\Foundation\EventDispatcher as BaseEventDispatcher;
|
|
|
|
use Symfony\Components\EventDispatcher\EventDispatcherInterface;
|
|
|
|
use Symfony\Components\EventDispatcher\Event;
|
|
|
|
use Symfony\Foundation\LoggerInterface;
|
|
|
|
use Symfony\Components\DependencyInjection\ContainerInterface;
|
|
|
|
|
|
|
|
/*
|
2010-04-07 01:51:29 +01:00
|
|
|
* This file is part of the Symfony package.
|
2010-02-17 13:54:36 +00:00
|
|
|
*
|
|
|
|
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
|
|
|
|
*
|
|
|
|
* For the full copyright and license information, please view the LICENSE
|
|
|
|
* file that was distributed with this source code.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* EventDispatcher extends the original EventDispatcher class to add some debugging tools.
|
|
|
|
*
|
2010-04-07 01:51:29 +01:00
|
|
|
* @package Symfony
|
|
|
|
* @subpackage Foundation
|
2010-02-17 13:54:36 +00:00
|
|
|
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
|
|
|
|
*/
|
|
|
|
class EventDispatcher extends BaseEventDispatcher
|
|
|
|
{
|
2010-05-06 12:25:53 +01:00
|
|
|
protected $logger;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructor.
|
|
|
|
*
|
|
|
|
* @param LoggerInterface $logger A LoggerInterface instance
|
|
|
|
*/
|
|
|
|
public function __construct(ContainerInterface $container, LoggerInterface $logger = null)
|
2010-02-17 13:54:36 +00:00
|
|
|
{
|
2010-05-06 12:25:53 +01:00
|
|
|
$this->logger = $logger;
|
2010-02-17 13:54:36 +00:00
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
parent::__construct($container);
|
2010-02-17 13:54:36 +00:00
|
|
|
}
|
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
/**
|
|
|
|
* Notifies all listeners of a given event.
|
|
|
|
*
|
|
|
|
* @param Event $event A Event instance
|
|
|
|
*
|
|
|
|
* @return Event The Event instance
|
|
|
|
*/
|
|
|
|
public function notify(Event $event)
|
2010-02-17 13:54:36 +00:00
|
|
|
{
|
2010-05-06 12:25:53 +01:00
|
|
|
foreach ($this->getListeners($event->getName()) as $listener)
|
2010-02-17 13:54:36 +00:00
|
|
|
{
|
2010-05-06 12:25:53 +01:00
|
|
|
if (null !== $this->logger)
|
|
|
|
{
|
|
|
|
$this->logger->debug(sprintf('Notifying event "%s" to listener "%s"', $event->getName(), $this->listenerToString($listener)));
|
|
|
|
}
|
|
|
|
|
|
|
|
call_user_func($listener, $event);
|
2010-02-17 13:54:36 +00:00
|
|
|
}
|
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
return $event;
|
2010-02-17 13:54:36 +00:00
|
|
|
}
|
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
/**
|
|
|
|
* Notifies all listeners of a given event until one returns a non null value.
|
|
|
|
*
|
|
|
|
* @param Event $event A Event instance
|
|
|
|
*
|
|
|
|
* @return Event The Event instance
|
|
|
|
*/
|
|
|
|
public function notifyUntil(Event $event)
|
2010-02-17 13:54:36 +00:00
|
|
|
{
|
2010-05-06 12:25:53 +01:00
|
|
|
foreach ($this->getListeners($event->getName()) as $listener)
|
|
|
|
{
|
|
|
|
if (null !== $this->logger)
|
|
|
|
{
|
|
|
|
$this->logger->debug(sprintf('Notifying (until) event "%s" to listener "%s"', $event->getName(), $this->listenerToString($listener)));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (call_user_func($listener, $event))
|
|
|
|
{
|
|
|
|
if (null !== $this->logger)
|
|
|
|
{
|
|
|
|
$this->logger->debug(sprintf('Listener "%s" processed the event "%s"', $this->listenerToString($listener), $event->getName()));
|
|
|
|
}
|
|
|
|
|
|
|
|
$event->setProcessed(true);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2010-02-17 13:54:36 +00:00
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
return $event;
|
2010-02-17 13:54:36 +00:00
|
|
|
}
|
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
/**
|
|
|
|
* Filters a value by calling all listeners of a given event.
|
|
|
|
*
|
|
|
|
* @param Event $event A Event instance
|
|
|
|
* @param mixed $value The value to be filtered
|
|
|
|
*
|
|
|
|
* @return Event The Event instance
|
|
|
|
*/
|
|
|
|
public function filter(Event $event, $value)
|
|
|
|
{
|
|
|
|
foreach ($this->getListeners($event->getName()) as $listener)
|
|
|
|
{
|
|
|
|
if (null !== $this->logger)
|
|
|
|
{
|
|
|
|
$this->logger->debug(sprintf('Notifying (filter) event "%s" to listener "%s"', $event->getName(), $this->listenerToString($listener)));
|
|
|
|
}
|
2010-02-17 13:54:36 +00:00
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
$value = call_user_func($listener, $event, $value);
|
|
|
|
}
|
2010-02-17 13:54:36 +00:00
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
$event->setReturnValue($value);
|
2010-02-17 13:54:36 +00:00
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
return $event;
|
2010-02-17 13:54:36 +00:00
|
|
|
}
|
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
protected function listenerToString($listener)
|
2010-02-17 13:54:36 +00:00
|
|
|
{
|
2010-05-06 12:25:53 +01:00
|
|
|
if (is_object($listener) && $listener instanceof \Closure)
|
|
|
|
{
|
|
|
|
return 'Closure';
|
|
|
|
}
|
|
|
|
|
|
|
|
if (is_string($listener))
|
|
|
|
{
|
|
|
|
return $listener;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (is_array($listener))
|
|
|
|
{
|
|
|
|
return sprintf('(%s, %s)', is_object($listener[0]) ? get_class($listener[0]) : $listener[0], $listener[1]);
|
|
|
|
}
|
2010-02-17 13:54:36 +00:00
|
|
|
}
|
|
|
|
}
|