Commit ae736bed authored by Taddeus Kroes's avatar Taddeus Kroes

A router handler function can now return FALSE to make the router ignore its return value.

parent 81cf52e6
......@@ -101,7 +101,10 @@ class Router extends Base {
* Call the handler function corresponding to the specified url.
*
* If any groups are in the matched regex pattern, a list of matches is
* passed to the handler function.
* passed to the handler function. If the handler function returns FALSE,
* the url has not been 'handled' and the next pattern will be checked for
* a match. Otherwise, the return value of the handler function is
* returned as the result.
*
* @param string $url An url to match the saved patterns against.
* @return mixed FALSE if no pattern was matched, the return value of the
......@@ -111,7 +114,10 @@ class Router extends Base {
foreach( $this->routes as $pattern => $handler ) {
if( preg_match($pattern, $url, $matches) ) {
array_shift($matches);
return call_user_func_array($handler, $matches);
$result = call_user_func_array($handler, $matches);
if( $result !== false )
return $result;
}
}
......
......@@ -12,7 +12,7 @@ function test_handler_arg($arg) {
}
function test_handler_args($arg0, $arg1) {
return $arg1.$arg0;
return $arg1 . $arg0;
}
class RouterTest extends PHPUnit_Framework_TestCase {
......@@ -25,19 +25,28 @@ class RouterTest extends PHPUnit_Framework_TestCase {
}
function test_call_handler_success() {
$this->assertEquals($this->router->call_handler('foo'), true);
$this->assertEquals($this->router->call_handler('bar'), 'bar');
$this->assertEquals($this->router->call_handler('baz'), 'baz');
$this->assertEquals($this->router->call_handler('bazbar'), 'barbaz');
$this->assertEquals(true, $this->router->call_handler('foo'));
$this->assertEquals('bar', $this->router->call_handler('bar'));
$this->assertEquals('baz', $this->router->call_handler('baz'));
$this->assertEquals('barbaz', $this->router->call_handler('bazbar'));
}
function test_call_handler_failure() {
$this->assertFalse($this->router->call_handler('barfoo'));
}
function test_call_handler_skip() {
$foo = 'foo';
$bar = function() use (&$foo) { $foo = 'bar'; return false; };
$baz = function() { return; };
$router = new Router(array('.*' => $bar, 'baz' => $baz));
$router->call_handler('baz');
$this->assertEquals('bar', $foo);
}
function test_add_route() {
$this->router->add_route('(foobar)', 'test_handler_arg');
$this->assertEquals($this->router->call_handler('foobar'), 'foobar');
$this->assertEquals('foobar', $this->router->call_handler('foobar'));
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment