From ef6076b2ce3aa9dc950b4ae06cdb6b07b722b8d3 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 11 May 2012 08:48:31 -0500 Subject: [PATCH] added event queues. --- laravel/documentation/changes.md | 1 + laravel/event.php | 61 ++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/laravel/documentation/changes.md b/laravel/documentation/changes.md index 9b3c9d96..2b5e2ec1 100644 --- a/laravel/documentation/changes.md +++ b/laravel/documentation/changes.md @@ -73,6 +73,7 @@ ## Laravel 3.2 - Fixed bug when using many-to-many relationships on non-default database connection. - Added true reflection based IoC to container. - Added `Request::route()->controller` and `Request::route()->controller_action`. +- Added `Event::queue`, `Event::flusher`, and `Event::flush` methods to Event class. ## Upgrading From 3.1 diff --git a/laravel/event.php b/laravel/event.php index 77442238..cfe01da2 100644 --- a/laravel/event.php +++ b/laravel/event.php @@ -9,6 +9,20 @@ class Event { */ public static $events = array(); + /** + * The queued events waiting for flushing. + * + * @var array + */ + public static $queued = array(); + + /** + * All of the registered queue flusher callbacks. + * + * @var array + */ + public static $flushers = array(); + /** * Determine if an event has any registered listeners. * @@ -54,6 +68,31 @@ public static function override($event, $callback) static::listen($event, $callback); } + /** + * Add an item to an event queue for processing. + * + * @param string $queue + * @param string $key + * @param mixed $data + * @return void + */ + public static function queue($queue, $key, $data) + { + static::$queued[$queue][$key] = $data; + } + + /** + * Register a queue flusher callback. + * + * @param string $queue + * @param mixed $callback + * @return void + */ + public static function flusher($queue, $callback) + { + static::$flushers[$queue][] = $callback; + } + /** * Clear all event listeners for a given event. * @@ -99,6 +138,28 @@ public static function until($event, $parameters = array()) return static::fire($event, $parameters, true); } + /** + * Flush an event queue, firing the flusher for each payload. + * + * @param string $queue + * @return void + */ + public static function flush($queue) + { + foreach (static::$flushers[$queue] as $flusher) + { + // We will simply spin through each payload registered for the event and + // fire the flusher, passing each payloads as we go. This allows all + // the events on the queue to be processed by the flusher easily. + foreach (static::$queued[$queue] as $key => $payload) + { + array_unshift($payload, $key); + + call_user_func_array($flusher, $payload); + } + } + } + /** * Fire an event so that all listeners are called. *