Propagate arguments to callable in HandlerUnpacker::unpack

This commit is contained in:
PJ Dietz 2015-02-22 09:08:15 -05:00
parent bc966f5924
commit d785e21fee
2 changed files with 26 additions and 15 deletions

View File

@ -2,20 +2,17 @@
namespace pjdietz\WellRESTed; namespace pjdietz\WellRESTed;
use pjdietz\WellRESTed\Interfaces\HandlerInterface; use pjdietz\WellRESTed\Interfaces\RequestInterface;
class HandlerUnpacker class HandlerUnpacker
{ {
public function unpack($handler) public function unpack($handler, RequestInterface $request = null, array $args = null)
{ {
if (is_callable($handler)) { if (is_callable($handler)) {
$handler = $handler(); $handler = $handler($request, $args);
} elseif (is_string($handler)) { } elseif (is_string($handler)) {
$handler = new $handler(); $handler = new $handler();
} }
if (!$handler instanceof HandlerInterface) {
throw new \UnexpectedValueException("Handler must implement HandlerInterface");
}
return $handler; return $handler;
} }
} }

View File

@ -21,6 +21,29 @@ class HandlerUnpackerTest extends \PHPUnit_Framework_TestCase
$this->assertInstanceOf("\\pjdietz\\WellRESTed\\Interfaces\\HandlerInterface", $handler); $this->assertInstanceOf("\\pjdietz\\WellRESTed\\Interfaces\\HandlerInterface", $handler);
} }
public function testPropagatesArgumentsToCallable()
{
$request = $this->prophesize("\\pjdietz\\WellRESTed\\Interfaces\\RequestInterface");
$args = [
"cat" => "Molly"
];
$callableRequest = null;
$callableArguments = null;
$handlerCallable = function ($rqst, $args) use (&$callableRequest, &$callableArguments) {
$callableRequest = $rqst;
$callableArguments = $args;
return null;
};
$handlerUnpacker = new HandlerUnpacker();
$handlerUnpacker->unpack($handlerCallable, $request->reveal(), $args);
$this->assertSame($callableRequest, $request->reveal());
$this->assertSame($callableArguments, $args);
}
public function testUnpacksFromString() public function testUnpacksFromString()
{ {
$handlerContainer = __NAMESPACE__ . "\\HandlerUnpackerTest_Handler"; $handlerContainer = __NAMESPACE__ . "\\HandlerUnpackerTest_Handler";
@ -36,15 +59,6 @@ class HandlerUnpackerTest extends \PHPUnit_Framework_TestCase
$handler = $handlerUnpacker->unpack($handler); $handler = $handlerUnpacker->unpack($handler);
$this->assertInstanceOf("\\pjdietz\\WellRESTed\\Interfaces\\HandlerInterface", $handler); $this->assertInstanceOf("\\pjdietz\\WellRESTed\\Interfaces\\HandlerInterface", $handler);
} }
/**
* @expectedException \UnexpectedValueException
*/
public function testThrowsExceptionWhenUnpackedInstanceDoesNotImplementInterface()
{
$handlerUnpacker = new HandlerUnpacker();
$handlerUnpacker->unpack("\\stdClass");
}
} }
class HandlerUnpackerTest_Handler implements HandlerInterface class HandlerUnpackerTest_Handler implements HandlerInterface