Deprecated: Assigning the return value of new by reference is deprecated in /home/bluestat/public_html/source/index.php on line 477
From b2dbddce15588261d2d29749c1f85ddabcdfcc29 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Mon, 24 Aug 2009 21:03:12 -0400 Subject: [PATCH] Create two callback closures used to load event classes and views * Add event_class_loader and view_loader to Context * Add a test for dispatching POST requests --- events/context.php | 25 ++++++++++++++++++++----- testing/tests/events/context_test.php | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/events/context.php b/events/context.php index f2d6453..70ad4c4 100644 --- a/events/context.php +++ b/events/context.php @@ -31,6 +31,17 @@ class Context // GET request. protected $base_url = '/'; + // This closure is used to load an event with a given underscored name. It + // must return a fully-qualified (including namespace) name of a class from + // this generic event name. Signature: + // function Class __closure(String $event_name); + protected $event_class_loader = null; + + // This closure is used to load a view for a specific Event object. + // Signature: + // function View __closure(Event $event); + protected $view_loader = null; + public function __construct() { $gpc = array( @@ -62,13 +73,11 @@ class Context throw new ContextException("Unknown HTTP method '$method'"); } - $event_name = \phalanx\base\underscore_to_cammelcase($event_name); - if (class_exists($event_name . 'Event')) - $event_name .= 'Event'; - else if (!class_exists($event_name)) + $event_class = $this->event_class_loader($event_name); + if (!class_exists($event_class)) throw new ContextException("Unable to locate event class for '$event_name'"); - $event = new $event_name(); + $event = new $event_class(); $event->set_context($this); EventPump::pump()->raise($event); } @@ -119,6 +128,12 @@ class Context $this->base_url = $url; } public function base_url() { return $this->base_url; } + + public function set_event_class_loader(\Closure $closure) { $this->event_class_loader = $closure; } + public function event_class_loader() { return $this->event_class_loader; } + + public function set_view_loader(\Closure $closure) { $this->view_loader = $closure; } + public function view_loader() { return $this->view_loader; } } class ContextException extends \Exception diff --git a/testing/tests/events/context_test.php b/testing/tests/events/context_test.php index d441c4d..7b89c19 100644 --- a/testing/tests/events/context_test.php +++ b/testing/tests/events/context_test.php @@ -149,4 +149,37 @@ class ContextTest extends \PHPUnit_Framework_TestCase $this->assertTrue($event->did_end); $this->assertTrue($context->did_event_handled); } + + public function testDispatchPOST() + { + $_SERVER['REQUEST_METHOD'] = 'POST'; + $_POST[TestContext::kEventPOSTVarKey] = 'test_event'; + $pump = events\EventPump::pump(); + $context = new TestContext(); + $pump->set_context($context); + $context->dispatch(); + $event = $pump->getLastEvent(); + $this->assertTrue($event->did_init); + $this->assertTrue($event->did_handle); + $this->assertTrue($event->did_end); + $this->assertTrue($context->did_event_handled); + } + + public function testSetEventClassLoader() + { + $closure = function($event_name) { return 'Load:' . $event_name; }; + $this->context->set_event_class_loader($closure); + $set_closure = $this->context->event_class_loader(); + $this->assertEquals('Load:test', $set_closure('test')); + } + + public function testSetViewLoader() + { + $event = new TestEvent(); + $event->test_prop = 'foo'; + $closure = function(events\Event $e) { return 'LoadView:' . $e->test_prop; }; + $this->context->set_view_loader($closure); + $set_closure = $this->context->view_loader(); + $this->assertEquals('LoadView:foo', $set_closure($event)); + } } -- 1.7.11.3