protected function initializeListeners($eventName, $loweredClass, $format) { $listeners = parent::initializeListeners($eventName, $loweredClass, $format); foreach ($listeners as &$listener) { if (!is_array($listener) || !is_string($listener[0])) { continue; } if (!$this->container->has($listener[0])) { continue; } $listener[0] = $this->container->get($listener[0]); } return $listeners; }
public function process(ContainerBuilder $container) { $listeners = array(); foreach ($container->findTaggedServiceIds('jms_serializer.event_listener') as $id => $tags) { if (!$container->getDefinition($id)->isPublic()) { throw new \RuntimeException(sprintf('The tag "jms_serializer.event_listener" of service "%s" requires the service to be public.', $id)); } foreach ($tags as $attributes) { if (!isset($attributes['event'])) { throw new \RuntimeException(sprintf('The tag "jms_serializer.event_listener" of service "%s" requires an attribute named "event".', $id)); } $class = isset($attributes['class']) ? strtolower($attributes['class']) : null; $format = isset($attributes['format']) ? $attributes['format'] : null; $method = isset($attributes['method']) ? $attributes['method'] : EventDispatcher::getDefaultMethodName($attributes['event']); $priority = isset($attributes['priority']) ? (int) $attributes['priority'] : 0; $listeners[$attributes['event']][$priority][] = array(array($id, $method), $class, $format); } } foreach ($container->findTaggedServiceIds('jms_serializer.event_subscriber') as $id => $tags) { $subscriberDefinition = $container->getDefinition($id); $subscriberClass = $container->getDefinition($id)->getClass(); $subscriberClassReflectionObj = new \ReflectionClass($subscriberClass); if (!$subscriberClassReflectionObj->implementsInterface('JMS\\SerializerBundle\\Serializer\\EventDispatcher\\EventSubscriberInterface')) { throw new \RuntimeException(sprintf('The service "%s" (class: %s) does not implement the EventSubscriberInterface.', $id, $subscriberClass)); } if (!$subscriberDefinition->isPublic()) { throw new \RuntimeException(sprintf('The tag "jms_serializer.event_listener" of service "%s" requires the service to be public.', $id)); } foreach (call_user_func(array($subscriberClass, 'getSubscribedEvents')) as $eventData) { if (!isset($eventData['event'])) { throw new \RuntimeException(sprintf('The service "%s" (class: %s) must return an event for each subscribed event.', $id, $subscriberClass)); } $class = isset($eventData['class']) ? strtolower($eventData['class']) : null; $format = isset($eventData['format']) ? $eventData['format'] : null; $method = isset($eventData['method']) ? $eventData['method'] : EventDispatcher::getDefaultMethodName($eventData['event']); $priority = isset($attributes['priority']) ? (int) $attributes['priority'] : 0; $listeners[$eventData['event']][$priority][] = array(array($id, $method), $class, $format); } } if ($listeners) { array_walk($listeners, function (&$value, $key) { ksort($value); }); foreach ($listeners as &$events) { $events = call_user_func_array('array_merge', $events); } $container->getDefinition('jms_serializer.event_dispatcher')->addMethodCall('setListeners', array($listeners)); } }