Attempts to parse a request object and determine its execution details.
public parse ( |
||
$request | A request object containing the details of the request to be routed. | |
$options | array | Used to determine the operation of the method, and override certain values in the `Request` object: - `'url'` _string_: If present, will be used to match in place of the `$url` property of `$request`. |
return | object | boolean | If this route matches `$request`, returns the request with execution details attached to it (inside `Request::$params`). Alternatively when a route handler function was used, returns the result of its invocation. Returns `false` if the route never matched. |
/** * Tests that routes with Unicode characters are correctly parsed. */ public function testUnicodeParameters() { $route = new Route(array('template' => '/{:slug:[\\pL\\pN\\-\\%]+}', 'params' => array('controller' => 'users', 'action' => 'view'))); $unicode = 'clément'; $slug = rawurlencode($unicode); $params = array('controller' => 'users', 'action' => 'view') + compact('slug'); $result = $route->match($params); $this->assertEqual("/{$slug}", $result); $request = new Request(array('url' => "/{$slug}")); $result = $route->parse($request, array('url' => $request->url)); $expected = array('controller' => 'users', 'action' => 'view') + compact('slug'); $this->assertEqual($expected, $result->params); $request = new Request(array('url' => "/{$slug}")); $result = $route->parse($request, array('url' => $request->url)); $expected = array('controller' => 'users', 'action' => 'view') + compact('slug'); $this->assertEqual($expected, $result->params); }
public function testRouteParsingWithRegexActionAndParamWithoutAction() { $route = new Route(array('template' => '/products/{:action:add|edit|remove}/{:category}', 'params' => array('controller' => 'Products'))); $request = new Request(); $request->url = '/products/hello'; $result = $route->parse($request); $this->assertEqual(false, $result); $request = new Request(); $request->url = '/products'; $result = $route->parse($request); $this->assertEqual(false, $result); }
/** * Tests that requests can be routed based on HTTP method verbs or HTTP headers. * * @return void */ public function testHeaderAndMethodBasedRouting() { $parameters = array('controller' => 'users', 'action' => 'edit'); $route = new Route(array('template' => '/', 'params' => $parameters + array('http:method' => 'POST'))); $request = new Request(array('env' => array('HTTP_METHOD' => 'GET'))); $request->url = '/'; $this->assertFalse($route->parse($request)); $request = new Request(array('env' => array('REQUEST_METHOD' => 'POST'))); $request->url = '/'; $this->assertEqual($parameters, $route->parse($request)->params); $route = new Route(array('template' => '/{:controller}/{:id:[0-9]+}', 'params' => $parameters + array('http:method' => array('POST', 'PUT')))); $request = new Request(array('env' => array('REQUEST_METHOD' => 'PUT'))); $request->url = '/users/abc'; $this->assertFalse($route->parse($request)); $request->url = '/users/54'; $this->assertEqual($parameters + array('id' => '54'), $route->parse($request)->params); }
public function testUrlEncodedArgs() { $route = new Route(array('template' => '/{:controller}/{:action}/{:args}')); $request = new Request(); $request->url = '/posts/index/Food%20%26%20Dining'; $result = $route->parse($request); $expected = array( 'controller' => 'posts', 'action' => 'index', 'args' => array('Food%20%26%20Dining') ); $this->assertEqual($expected, $result->params); }
/** * Tests creating a route with a custom regex sub-pattern in a template * * @return void */ public function testCustomSubPattern() { $route = new Route(array('template' => '/{:controller}/{:action}/{:user:\\d+}')); $request = new Request(); $request->url = '/users/view/10'; $expected = array('controller' => 'users', 'action' => 'view', 'user' => '10'); $result = $route->parse($request); $this->assertEqual($expected, $result); $request->url = '/users/view/my_login'; $result = $route->parse($request); $this->assertFalse($result); }