RegisterEventListenersAndSubscribersPass.php 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <?php
  2. namespace JMS\SerializerBundle\DependencyInjection\Compiler;
  3. use JMS\SerializerBundle\Serializer\EventDispatcher\EventDispatcher;
  4. use JMS\SerializerBundle\Serializer\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\DependencyInjection\ContainerBuilder;
  6. use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
  7. class RegisterEventListenersAndSubscribersPass implements CompilerPassInterface
  8. {
  9. public function process(ContainerBuilder $container)
  10. {
  11. $listeners = array();
  12. foreach ($container->findTaggedServiceIds('jms_serializer.event_listener') as $id => $tags) {
  13. foreach ($tags as $attributes) {
  14. if ( ! isset($attributes['event'])) {
  15. throw new \RuntimeException(sprintf('The tag "jms_serializer.event_listener" of service "%s" requires an attribute named "event".', $id));
  16. }
  17. $class = isset($attributes['class']) ? $attributes['class'] : null;
  18. $format = isset($attributes['format']) ? $attributes['format'] : null;
  19. $method = isset($attributes['method']) ? $attributes['method'] : EventDispatcher::getDefaultMethodName($attributes['event']);
  20. $priority = isset($attributes['priority']) ? (integer) $attributes['priority'] : 0;
  21. $listeners[$priority][] = array($attributes['event'], array($id, $method), $class, $format);
  22. }
  23. }
  24. foreach ($container->findTaggedServiceIds('jms_serializer.event_subscriber') as $id => $tags) {
  25. $subscriberClass = $container->getDefinition($id)->getClass();
  26. $subscriberClassReflectionObj = new \ReflectionClass($subscriberClass);
  27. if ( ! $subscriberClassReflectionObj->implementsInterface('JMS\SerializerBundle\Serializer\EventDispatcher\EventSubscriberInterface') ) {
  28. throw new \RuntimeException(sprintf('The service "%s" (class: %s) does not implement the EventSubscriberInterface.', $id, $subscriberClass));
  29. }
  30. foreach (call_user_func(array($subscriberClass, 'getSubscribedEvents')) as $eventData) {
  31. if ( ! isset($eventData['event'])) {
  32. throw new \RuntimeException(sprintf('The service "%s" (class: %s) must return an event for each subscribed event.', $id, $subscriberClass));
  33. }
  34. $class = isset($eventData['class']) ? $eventData['class'] : null;
  35. $format = isset($eventData['format']) ? $eventData['format'] : null;
  36. $method = isset($eventData['method']) ? $eventData['method'] : EventDispatcher::getDefaultMethodName($eventData['event']);
  37. $priority = isset($attributes['priority']) ? (integer) $attributes['priority'] : 0;
  38. $listeners[$priority][] = array($eventData['event'], array($id, $method), $class, $format);
  39. }
  40. }
  41. if ($listeners) {
  42. ksort($listeners);
  43. $container->getDefinition('jms_serializer.event_dispatcher')
  44. ->addMethodCall('setListeners', array(call_user_func_array('array_merge', $listeners)));
  45. }
  46. }
  47. }