瀏覽代碼

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

Taddeus Kroes 13 年之前
父節點
當前提交
ae736bedec
共有 2 個文件被更改,包括 23 次插入8 次删除
  1. 8 2
      router.php
  2. 15 6
      tests/test_router.php

+ 8 - 2
router.php

@@ -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;
 			}
 		}
 		

+ 15 - 6
tests/test_router.php

@@ -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'));
 	}
 }