diff options
Diffstat (limited to 'phpBB/includes/event')
| -rw-r--r-- | phpBB/includes/event/data.php | 68 | ||||
| -rw-r--r-- | phpBB/includes/event/dispatcher.php | 42 | ||||
| -rw-r--r-- | phpBB/includes/event/extension_subscriber_loader.php | 46 | 
3 files changed, 156 insertions, 0 deletions
diff --git a/phpBB/includes/event/data.php b/phpBB/includes/event/data.php new file mode 100644 index 0000000000..70718ff0ae --- /dev/null +++ b/phpBB/includes/event/data.php @@ -0,0 +1,68 @@ +<?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\EventDispatcher\Event; + +class phpbb_event_data extends Event implements ArrayAccess +{ +    private $data; + +    public function __construct(array $data = array()) +    { +        $this->set_data($data); +    } + +    public function set_data(array $data = array()) +    { +        $this->data = $data; +    } + +    public function get_data() +    { +        return $this->data; +    } + +    /** +     * Returns data filtered to only include specified keys. +     * +     * This effectively discards any keys added to data by hooks. +     */ +    public function get_data_filtered($keys) +    { +        return array_intersect_key($this->data, array_flip($keys)); +    } + +    public function offsetExists($offset) +    { +        return isset($this->data[$offset]); +    } + +    public function offsetGet($offset) +    { +        return isset($this->data[$offset]) ? $this->data[$offset] : null; +    } + +    public function offsetSet($offset, $value) +    { +        $this->data[$offset] = $value; +    } + +    public function offsetUnset($offset) +    { +        unset($this->data[$offset]); +    } +} diff --git a/phpBB/includes/event/dispatcher.php b/phpBB/includes/event/dispatcher.php new file mode 100644 index 0000000000..2bf46b9b06 --- /dev/null +++ b/phpBB/includes/event/dispatcher.php @@ -0,0 +1,42 @@ +<?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\EventDispatcher\EventDispatcher; + +/** +* Extension of the Symfony2 EventDispatcher +* +* It provides an additional `trigger_event` method, which +* gives some syntactic sugar for dispatching events. Instead +* of creating the event object, the method will do that for +* you. +* +* Example: +* +*     $vars = array('page_title'); +*     extract($phpbb_dispatcher->trigger_event('core.index', compact($vars))); +* +*/ +class phpbb_event_dispatcher extends EventDispatcher +{ +	public function trigger_event($eventName, $data = array()) +	{ +		$event = new phpbb_event_data($data); +		$this->dispatch($eventName, $event); +		return $event->get_data_filtered(array_keys($data)); +	} +} diff --git a/phpBB/includes/event/extension_subscriber_loader.php b/phpBB/includes/event/extension_subscriber_loader.php new file mode 100644 index 0000000000..d933b943d7 --- /dev/null +++ b/phpBB/includes/event/extension_subscriber_loader.php @@ -0,0 +1,46 @@ +<?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\EventDispatcher\EventDispatcherInterface; + +class phpbb_event_extension_subscriber_loader +{ +	private $dispatcher; +	private $extension_manager; + +	public function __construct(EventDispatcherInterface $dispatcher, phpbb_extension_manager $extension_manager) +	{ +		$this->dispatcher = $dispatcher; +		$this->extension_manager = $extension_manager; +	} + +	public function load() +	{ +		$finder = $this->extension_manager->get_finder(); +		$subscriber_classes = $finder +			->extension_directory('/event') +			->suffix('listener') +			->core_path('event/') +			->get_classes(); + +		foreach ($subscriber_classes as $class) +		{ +			$subscriber = new $class(); +			$this->dispatcher->addSubscriber($subscriber); +		} +	} +}  | 
