14 use Symfony\Component\DependencyInjection\ContainerInterface;
31 private $listenerIds = array();
36 private $listeners = array();
40 $this->container = $container;
57 if (!\is_array($callback) || 2 !== \count($callback)) {
58 throw new \InvalidArgumentException(
'Expected an array("service", "method") argument');
61 $this->listenerIds[$eventName][] = array($callback[0], $callback[1], $priority);
68 if (isset($this->listenerIds[$eventName])) {
69 foreach ($this->listenerIds[$eventName] as $i => $args) {
70 list($serviceId, $method) = $args;
71 $key = $serviceId.
'.'.$method;
72 if (isset($this->listeners[$eventName][$key]) && $listener === array($this->listeners[$eventName][$key], $method)) {
73 unset($this->listeners[$eventName][$key]);
74 if (empty($this->listeners[$eventName])) {
75 unset($this->listeners[$eventName]);
77 unset($this->listenerIds[$eventName][$i]);
78 if (empty($this->listenerIds[$eventName])) {
79 unset($this->listenerIds[$eventName]);
85 parent::removeListener($eventName, $listener);
93 if (
null === $eventName) {
94 return $this->listenerIds || $this->listeners || parent::hasListeners();
97 if (isset($this->listenerIds[$eventName])) {
101 return parent::hasListeners($eventName);
109 if (
null === $eventName) {
110 foreach ($this->listenerIds as $serviceEventName => $args) {
117 return parent::getListeners($eventName);
127 return parent::getListenerPriority($eventName, $listener);
138 foreach ($class::getSubscribedEvents() as $eventName => $params) {
139 if (\is_string($params)) {
140 $this->listenerIds[$eventName][] = array($serviceId, $params, 0);
141 } elseif (\is_string($params[0])) {
142 $this->listenerIds[$eventName][] = array($serviceId, $params[0], isset($params[1]) ? $params[1] : 0);
144 foreach ($params as $listener) {
145 $this->listenerIds[$eventName][] = array($serviceId, $listener[0], isset($listener[1]) ? $listener[1] : 0);
153 return $this->container;
166 if (isset($this->listenerIds[$eventName])) {
167 foreach ($this->listenerIds[$eventName] as $args) {
168 list($serviceId, $method, $priority) = $args;
169 $listener = $this->container->get($serviceId);
171 $key = $serviceId.
'.'.$method;
172 if (!isset($this->listeners[$eventName][$key])) {
173 $this->
addListener($eventName, array($listener, $method), $priority);
174 } elseif ($this->listeners[$eventName][$key] !== $listener) {
175 parent::removeListener($eventName, array($this->listeners[$eventName][$key], $method));
176 $this->
addListener($eventName, array($listener, $method), $priority);
179 $this->listeners[$eventName][$key] = $listener;