From 067a77073015adf56fb3730417ac2a6d62ce454c Mon Sep 17 00:00:00 2001
From: David King <imkingdavid@gmail.com>
Date: Sat, 20 Oct 2012 17:06:04 -0400
Subject: [feature/controller] Transfer kernel-related stuff from container PR

PHPBB3-10864
---
 phpBB/includes/event/kernel_compiler_pass.php | 72 +++++++++++++++++++++++++++
 1 file changed, 72 insertions(+)
 create mode 100644 phpBB/includes/event/kernel_compiler_pass.php

(limited to 'phpBB/includes/event/kernel_compiler_pass.php')

diff --git a/phpBB/includes/event/kernel_compiler_pass.php b/phpBB/includes/event/kernel_compiler_pass.php
new file mode 100644
index 0000000000..18b6661cd4
--- /dev/null
+++ b/phpBB/includes/event/kernel_compiler_pass.php
@@ -0,0 +1,72 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+	exit;
+}
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+
+class phpbb_event_kernel_compiler_pass implements CompilerPassInterface
+{
+	/**
+	* Modify the container before it is passed to the rest of the code
+	*
+	* @param ContainerBuilder $container ContainerBuilder object
+	* @return null
+	*/
+	public function process(ContainerBuilder $container)
+	{
+		$definition = $container->getDefinition('dispatcher');
+		$user = $container->get('user');
+
+		foreach ($container->findTaggedServiceIds('kernel.event_listener') as $id => $events)
+		{
+			foreach ($events as $event)
+			{
+				$priority = isset($event['priority']) ? $event['priority'] : 0;
+
+				if (!isset($event['event']))
+				{
+					throw new InvalidArgumentException($user->lang('NO_EVENT_ATTRIBUTE', $id));
+				}
+
+				if (!isset($event['method']))
+				{
+					$event['method'] = 'on'.preg_replace(array(
+						'/(?<=\b)[a-z]/ie',
+						'/[^a-z0-9]/i'
+					), array('strtoupper("\\0")', ''), $event['event']);
+				}
+
+				$definition->addMethodCall('addListenerService', array($event['event'], array($id, $event['method']), $priority));
+			}
+		}
+
+		foreach ($container->findTaggedServiceIds('kernel.event_subscriber') as $id => $attributes)
+		{
+			// We must assume that the class value has been correctly filled, even if the service is created by a factory
+			$class = $container->getDefinition($id)->getClass();
+
+			$refClass = new ReflectionClass($class);
+			$interface = 'Symfony\Component\EventDispatcher\EventSubscriberInterface';
+			if (!$refClass->implementsInterface($interface))
+			{
+				throw new InvalidArgumentException($user->lang('SUBSCRIBER_WRONG_TYPE', $id, $interface));
+			}
+
+			$definition->addMethodCall('addSubscriberService', array($id, $class));
+		}
+	}
+}
-- 
cgit v1.2.1