Router can return a default 404 response when no routes match the request.
Add functionality to Request to carve up a URI and set the corresponding members.
This commit is contained in:
parent
4c0434399a
commit
ef31fd7292
162
Request.inc.php
162
Request.inc.php
|
|
@ -2,9 +2,7 @@
|
|||
|
||||
namespace wellrested;
|
||||
|
||||
/*******************************************************************************
|
||||
* Request
|
||||
*
|
||||
/**
|
||||
* A Request instance contains information relating to the current HTTP request
|
||||
* a client sent to the server.
|
||||
*
|
||||
|
|
@ -12,58 +10,69 @@ namespace wellrested;
|
|||
* request, the class exposes the static getRequest() method for obtaining a
|
||||
* singleton Request instance.
|
||||
*
|
||||
* @package WellRESTed
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/**
|
||||
* @property string body Entity body of the request
|
||||
* @property array headers Associative array of HTTP headers
|
||||
* @property string method HTTP method or verb for the request
|
||||
* @property string path Path component of the URI for the request
|
||||
* @property string pathParts Fragments of the path, delimited by slashes
|
||||
* @property array query Associative array of query parameters
|
||||
*
|
||||
* @package WellRESTed
|
||||
*/
|
||||
class Request {
|
||||
class Request {
|
||||
|
||||
/**
|
||||
* Entity body of the request
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $body;
|
||||
|
||||
/**
|
||||
* Associative array of HTTP headers
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $headers;
|
||||
|
||||
/**
|
||||
* HTTP method or verb for the request
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $method;
|
||||
|
||||
/**
|
||||
* Path component of the URI for the request
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $path;
|
||||
|
||||
/**
|
||||
* Array of fragments of the path, delimited by slashes
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $pathParts;
|
||||
|
||||
/**
|
||||
* Associative array of query parameters
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $query;
|
||||
|
||||
/**
|
||||
* The full URI of the request
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $uri;
|
||||
|
||||
/**
|
||||
* Singleton instance derived from reading info from Apache.
|
||||
*
|
||||
* @var Request
|
||||
* @static
|
||||
*/
|
||||
|
|
@ -73,27 +82,57 @@ namespace wellrested;
|
|||
// -------------------------------------------------------------------------
|
||||
// !Accessors
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @return array|string
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function __get($name) {
|
||||
|
||||
switch ($name) {
|
||||
case 'body':
|
||||
return $this->getBody();
|
||||
case 'headers':
|
||||
return $this->getHeaders();
|
||||
case 'method':
|
||||
return $this->getMethod();
|
||||
case 'path':
|
||||
return $this->getPath();
|
||||
case 'pathParts':
|
||||
return $this->getPathParts();
|
||||
case 'query':
|
||||
return $this->getQuery();
|
||||
default:
|
||||
throw new \Exception('Property ' . $name . ' does not exist.');
|
||||
case 'body':
|
||||
return $this->getBody();
|
||||
case 'headers':
|
||||
return $this->getHeaders();
|
||||
case 'method':
|
||||
return $this->getMethod();
|
||||
case 'path':
|
||||
return $this->getPath();
|
||||
case 'pathParts':
|
||||
return $this->getPathParts();
|
||||
case 'query':
|
||||
return $this->getQuery();
|
||||
case 'uri':
|
||||
return $this->getUri();
|
||||
default:
|
||||
throw new \Exception('Property ' . $name . ' does not exist.');
|
||||
}
|
||||
|
||||
} // __get()
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @param mixed $value
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function __set($name, $value) {
|
||||
|
||||
switch ($name) {
|
||||
case 'path':
|
||||
$this->setPath($value);
|
||||
return;
|
||||
case 'query':
|
||||
$this->setQuery($value);
|
||||
return;
|
||||
case 'uri':
|
||||
$this->setUri($value);
|
||||
return;
|
||||
default:
|
||||
throw new \Exception('Property ' . $name . 'does not exist.');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function getBody() {
|
||||
return $this->body;
|
||||
}
|
||||
|
|
@ -118,6 +157,73 @@ namespace wellrested;
|
|||
return $this->query;
|
||||
}
|
||||
|
||||
public function getUri() {
|
||||
return $this->uri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the path and pathParts members.
|
||||
*
|
||||
* @param string $path
|
||||
*/
|
||||
public function setPath($path) {
|
||||
|
||||
$this->path = $path;
|
||||
$this->pathParts = explode('/', substr($path, 1));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string|array $query
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public function setQuery($query) {
|
||||
|
||||
if (is_string($query)) {
|
||||
$qs = $query;
|
||||
parse_str($qs, $query);
|
||||
}
|
||||
|
||||
if (is_array($query)) {
|
||||
$this->query = $query;
|
||||
} else {
|
||||
throw new \InvalidArgumentException('Unable to parse query string.');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the URI for the Request. This method also sets the path, pathParts,
|
||||
* and query.
|
||||
*
|
||||
* @param string $uri
|
||||
*/
|
||||
public function setUri($uri) {
|
||||
|
||||
/*
|
||||
* TODO, eventually do all of these:
|
||||
http
|
||||
host
|
||||
port
|
||||
user
|
||||
pass
|
||||
path
|
||||
query - after the question mark ?
|
||||
fragment - after the hashmark #
|
||||
*/
|
||||
|
||||
$this->uri = $uri;
|
||||
$parsed = parse_url($uri);
|
||||
|
||||
$path = isset($parsed['path']) ? $parsed['path'] : '';
|
||||
$this->setPath($path);
|
||||
|
||||
$query = isset($parsed['query']) ? $parsed['query'] : '';
|
||||
$this->setQuery($query);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
|
|
@ -126,17 +232,9 @@ namespace wellrested;
|
|||
protected function readHttpRequest() {
|
||||
|
||||
$this->body = file_get_contents("php://input");
|
||||
|
||||
$this->headers = apache_request_headers();
|
||||
|
||||
$this->method = $_SERVER['REQUEST_METHOD'];
|
||||
|
||||
$uri = parse_url($_SERVER['REQUEST_URI']);
|
||||
$this->path = $uri['path'];
|
||||
|
||||
$this->pathParts = explode('/', substr($this->path, 1));
|
||||
|
||||
$this->query = $_GET;
|
||||
$this->setUri($_SERVER['REQUEST_URI']);
|
||||
|
||||
} // readHttpRequest()
|
||||
|
||||
|
|
|
|||
|
|
@ -38,10 +38,9 @@ class Response {
|
|||
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
public function __construct($statusCode=500, $body='', $headers=null) {
|
||||
public function __construct($statusCode=500, $body=null, $headers=null) {
|
||||
|
||||
$this->statusCode = $statusCode;
|
||||
$this->body = $body;
|
||||
|
||||
if (is_array($headers)) {
|
||||
$this->headers = $headers;
|
||||
|
|
@ -49,6 +48,10 @@ class Response {
|
|||
$this->headers = array();
|
||||
}
|
||||
|
||||
if (!is_null($body)) {
|
||||
$this->body = $body;
|
||||
}
|
||||
|
||||
} // __construct()
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
namespace wellrested;
|
||||
|
||||
require_once(dirname(__FILE__) . '/Request.inc.php');
|
||||
require_once(dirname(__FILE__) . '/Response.inc.php');
|
||||
require_once(dirname(__FILE__) . '/Route.inc.php');
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
@ -35,18 +36,17 @@ class Router {
|
|||
} // addRoute()
|
||||
|
||||
/**
|
||||
* @param string $requestPath
|
||||
* @return Handler
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
public function getRequestHandler($requestPath=null) {
|
||||
public function getResponse($request=null) {
|
||||
|
||||
if (is_null($requestPath)) {
|
||||
if (is_null($request)) {
|
||||
$request = Request::getRequest();
|
||||
$path = $request->path;
|
||||
} else {
|
||||
$path = $requestPath;
|
||||
}
|
||||
|
||||
$path = $request->path;
|
||||
|
||||
foreach ($this->routes as $route) {
|
||||
|
||||
if (preg_match($route->pattern, $path, $matches)) {
|
||||
|
|
@ -57,17 +57,29 @@ class Router {
|
|||
require_once($route->handlerPath);
|
||||
}
|
||||
|
||||
// TODO: Need to rethink this plan. May not have a $request yet.
|
||||
return $handler = new $klass($request, $matches);
|
||||
$handler = new $klass($request, $matches);
|
||||
return $handler->response;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
return $this->getNoRouteResponse($request);
|
||||
|
||||
} // getRequestHandler()
|
||||
|
||||
/**
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
protected function getNoRouteResponse(Request $request) {
|
||||
|
||||
$response = new Response(404);
|
||||
$response->body = 'No resource at ' . $request->uri;
|
||||
return $response;
|
||||
|
||||
}
|
||||
|
||||
} // Router
|
||||
|
||||
?>
|
||||
|
|
|
|||
Loading…
Reference in New Issue