Skip to content

Commit

Permalink
Merge pull request #1348 from akrabat/remove-routeargs-subarray
Browse files Browse the repository at this point in the history
Update route strategy work
  • Loading branch information
silentworks committed Jul 12, 2015
2 parents 50de533 + b02d02c commit 060f98e
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 16 deletions.
3 changes: 1 addition & 2 deletions Slim/App.php
Original file line number Diff line number Diff line change
Expand Up @@ -375,8 +375,7 @@ public function __invoke(ServerRequestInterface $request, ResponseInterface $res
foreach ($routeInfo[2] as $k => $v) {
$routeArguments[$k] = urldecode($v);
}
$request = $request->withAttribute('routeArguments', $routeArguments);
return $routeInfo[1]($request, $response);
return $routeInfo[1]($request, $response, $routeArguments);
} elseif ($routeInfo[0] === Dispatcher::METHOD_NOT_ALLOWED) {
/** @var callable $notAllowedHandler */
$notAllowedHandler = $this->container->get('notAllowedHandler');
Expand Down
15 changes: 12 additions & 3 deletions Slim/Handlers/Strategies/RequestResponse.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,20 @@ class RequestResponse implements InvocationStrategyInterface
* @param array|callable $callable
* @param ServerRequestInterface $request
* @param ResponseInterface $response
* @param array $routeArguments
*
* @return mixed
*/
public function __invoke(callable $callable, ServerRequestInterface $request, ResponseInterface $response)
{
return $callable($request, $response, $request->getAttribute('routeArguments'));
public function __invoke(
callable $callable,
ServerRequestInterface $request,
ResponseInterface $response,
array $routeArguments
) {
foreach ($routeArguments as $k => $v) {
$request = $request->withAttribute($k, $v);
}

return $callable($request, $response, $routeArguments);
}
}
17 changes: 10 additions & 7 deletions Slim/Handlers/Strategies/RequestResponseArgs.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,18 @@ class RequestResponseArgs implements InvocationStrategyInterface
* @param array|callable $callable
* @param ServerRequestInterface $request
* @param ResponseInterface $response
* @param array $routeArguments
*
* @return mixed
*/
public function __invoke(callable $callable, ServerRequestInterface $request, ResponseInterface $response)
{
$arguments = [$request, $response];
foreach ($request->getAttribute('routeArguments') as $k => $v) {
array_push($arguments, $v);
}
return call_user_func_array($callable, $arguments);
public function __invoke(
callable $callable,
ServerRequestInterface $request,
ResponseInterface $response,
array $routeArguments
) {
array_unshift($routeArguments, $request, $response);

return call_user_func_array($callable, $routeArguments);
}
}
3 changes: 2 additions & 1 deletion Slim/Interfaces/InvocationStrategyInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,9 @@ interface InvocationStrategyInterface
* @param callable $callable The callable to invoke using the strategy.
* @param ServerRequestInterface $request The request object.
* @param ResponseInterface $response The response object.
* @param array $routeParams The route's placholder arguments
*
* @return ResponseInterface|string The response from the callable.
*/
public function __invoke(callable $callable, ServerRequestInterface $request, ResponseInterface $response);
public function __invoke(callable $callable, ServerRequestInterface $request, ResponseInterface $response, array $routeArguments);
}
71 changes: 68 additions & 3 deletions Slim/Route.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,13 @@ class Route extends Routable implements RouteInterface
*/
protected $outputBuffering = 'append';

/**
* Route parameters
*
* @var array
*/
protected $arguments = [];

/**
* Create new route
*
Expand Down Expand Up @@ -205,6 +212,56 @@ public function setName($name)
return $this;
}

/**
* Set a route argument
*
* @param string $name
* @param string $value
*
* @return $this
*/
public function setArgument($name, $value)
{
$this->arguments[$name] = $value;
return $this;
}

/**
* Replace route arguments
*
* @param array $arguments
*
* @return $this
*/
public function setArguments($arguments)
{
$this->arguments = $arguments;
return $this;
}

/**
* Retrieve route arguments
*
* @return array
*/
public function getArguments()
{
return $this->arguments;
}

/**
* Retrieve a specific route argument
*
* @return array
*/
public function getArgument($name, $default = null)
{
if (array_key_exists($name, $this->arguments)) {
return $this->arguments[$name];
}
return $default;
}

/********************************************************************************
* Route Runner
*******************************************************************************/
Expand All @@ -218,11 +275,19 @@ public function setName($name)
*
* @param ServerRequestInterface $request
* @param ResponseInterface $response
* @param array $arguments
*
* @return ResponseInterface
*/
public function run(ServerRequestInterface $request, ResponseInterface $response)
public function run(ServerRequestInterface $request, ResponseInterface $response, array $arguments)
{
foreach ($arguments as $k => $v) {
$this->setArgument($k, $v);
}

// add this route to the request's attributes in case route middleware needs access to route arguments
$request = $request->withAttribute('route', $this);

// Traverse middleware stack and fetch updated response
return $this->callMiddlewareStack($request, $response);
}
Expand All @@ -246,11 +311,11 @@ public function __invoke(ServerRequestInterface $request, ResponseInterface $res

// invoke route callable
if ($this->outputBuffering === false) {
$newResponse = $handler($this->callable, $request, $response);
$newResponse = $handler($this->callable, $request, $response, $this->arguments);
} else {
try {
ob_start();
$newResponse = $handler($this->callable, $request, $response);
$newResponse = $handler($this->callable, $request, $response, $this->arguments);
$output = ob_get_clean();
} catch (Exception $e) {
ob_end_clean();
Expand Down
16 changes: 16 additions & 0 deletions tests/RouteTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,22 @@ public function testGetCallable()
$this->assertTrue(is_callable($callable));
}

public function testArgumentSetting()
{
$route = $this->routeFactory();
$route->setArguments(['foo' => 'FOO', 'bar' => 'BAR']);
$this->assertSame($route->getArguments(), ['foo' => 'FOO', 'bar' => 'BAR']);
$route->setArgument('bar', 'bar');
$this->assertSame($route->getArguments(), ['foo' => 'FOO', 'bar' => 'bar']);
$route->setArgument('baz', 'BAZ');
$this->assertSame($route->getArguments(), ['foo' => 'FOO', 'bar' => 'bar', 'baz' => 'BAZ']);

$route->setArguments(['a' => 'b']);
$this->assertSame($route->getArguments(), ['a' => 'b']);
$this->assertSame($route->getArgument('a', 'default'), 'b');
$this->assertSame($route->getArgument('b', 'default'), 'default');
}


public function testBottomMiddlewareIsRoute()
{
Expand Down

0 comments on commit 060f98e

Please sign in to comment.