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