| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- <?php
- /**
- * Functions for URL routing: given an URL, call the corresponding handler
- * function (the 'route' to the corresponding output).
- *
- * @author Taddeus Kroes
- * @version 1.0
- * @date 14-07-2012
- */
- namespace BasicWeb;
- require_once 'base.php';
- /**
- *
- *
- * <code>
- *
- * </code>
- *
- * @package BasicWeb
- * @todo Example
- */
- class Router extends Base {
- /**
- * The regex delimiter that is added to the begin and end of patterns.
- *
- * @var string
- */
- const DELIMITER = '%';
-
- /**
- * An associative array of regex patterns pointing to handler functions.
- *
- * @var array
- */
- private $routes = array();
-
- /**
- * Create a new Router instance.
- *
- * @param array $routes An initial list of routes to set.
- */
- function __construct(array $routes=array()) {
- foreach( $routes as $pattern => $handler )
- $this->add_route($pattern, $handler);
- }
-
- /**
- * Add a route as a (pattern, handler) pair.
- *
- * The pattern is regular expression pattern without delimiters. The
- * function adds '%^' at the begin and '$%' at the end of the pattern as
- * delimiters.
- *
- * The handler function must receive no arguments if the regex pattern
- * does not contain groups (which are contained in parentheses). If there
- * are groups, the matches for these are passed to the handler fucntion in
- * an array.
- *
- * @param string $pattern A regex pattern to mach URL's against.
- * @param mixed $handler The handler function to call when $pattern is matched.
- * @throws \InvalidArgumentException If $handler is not callable.
- */
- function add_route($pattern, $handler) {
- if( !is_callable($handler) )
- throw new \InvalidArgumentException(sprintf('Handler for patterns "%s" is not callable.', $pattern));
-
- $this->routes[self::DELIMITER.'^'.$pattern.'$'.self::DELIMITER] = $handler;
- }
-
- /**
- * 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.
- *
- * @param string $url An url to match the saved patterns against.
- * @return mixed FALSE if no pattern was matched, the return value of the
- * corresponding handler function otherwise.
- */
- function call_handler($url) {
- foreach( $this->routes as $pattern => $handler ) {
- if( preg_match($pattern, $url, $matches) ) {
- array_shift($matches);
- return call_user_func_array($handler, $matches);
- }
- }
-
- return false;
- }
- }
- ?>
|