Your Slim app’s routes and middleware are given a PSR 7 request object that represents the current HTTP request received by your web server. The request object implements the PSR 7 ServerRequestInterface with which you can inspect and manipulate the HTTP request method, headers, and body.
The PSR 7 request object is injected into your Slim application routes as the first argument to the route callback like this:
The PSR 7 request object is injected into your Slim application middleware as the first argument of the middleware callable like this:
<?php
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
$app = new \Slim\App;
$app->add(function (ServerRequestInterface $request, ResponseInterface $response, callable $next) {
// Use the PSR 7 $request object
return $next($request, $response);
});
// Define app routes...
$app->run();
Every HTTP request has a method that is typically one of:
You can inspect the HTTP request’s method with the Request object method
appropriately named getMethod()
.
$method = $request->getMethod();
Because this is a common task, Slim’s
built-in PSR 7 implementation also provides these proprietary methods that return
true
or false
.
$request->isGet()
$request->isPost()
$request->isPut()
$request->isDelete()
$request->isHead()
$request->isPatch()
$request->isOptions()
It is possible to fake or override the HTTP request method. This is
useful if, for example, you need to mimic a PUT
request using a traditional
web browser that only supports GET
or POST
requests.
There are two ways to override the HTTP request method. You can include a
_METHOD
parameter in a POST
request’s body. The HTTP request must use the
application/x-www-form-urlencoded
content type.
POST /path HTTP/1.1
Host: example.com
Content-type: application/x-www-form-urlencoded
Content-length: 22
data=value&_METHOD=PUT
You can also override the HTTP request method with a custom
X-Http-Method-Override
HTTP request header. This works with any HTTP request
content type.
POST /path HTTP/1.1
Host: example.com
Content-type: application/json
Content-length: 16
X-Http-Method-Override: PUT
{"data":"value"}
You can fetch the original (non-overridden) HTTP method with the PSR 7 Request
object’s method named getOriginalMethod()
.
Every HTTP request has a URI that identifies the requested application resource. The HTTP request URI has several parts:
http
or https
)example.com
)80
or 443
)/users/1
)sort=created&dir=asc
)You can fetch the PSR 7 Request object’s URI object with its getUri()
method:
$uri = $request->getUri();
The PSR 7 Request object’s URI is itself an object that provides the following methods to inspect the HTTP request’s URL parts:
getScheme()
getAuthority()
getUserInfo()
getHost()
getPort()
getPath()
getBasePath()
getQuery()
(returns the full query string, e.g. a=1&b=2
)getFragment()
getBaseUrl()
You can get the query parameters as an associative array on the Request object using getQueryParams()
.
getBasePath()
method. This will be an empty string if the Slim application is installed
in the document root's top-most directory.
Every HTTP request has headers. These are metadata that describe the HTTP request but are not visible in the request’s body. Slim’s PSR 7 Request object provides several methods to inspect its headers.
You can fetch all HTTP request headers as an associative array with the PSR 7
Request object’s getHeaders()
method. The resultant associative array’s keys
are the header names and its values are themselves a numeric array of string
values for their respective header name.
$headers = $request->getHeaders();
foreach ($headers as $name => $values) {
echo $name . ": " . implode(", ", $values);
}
You can get a single header’s value(s) with the PSR 7 Request object’s getHeader($name)
method. This returns an array of values for the given header name. Remember, a single
HTTP header may have more than one value!
$headerValueArray = $request->getHeader('Accept');
You may also fetch a comma-separated string with all values for a given header
with the PSR 7 Request object’s getHeaderLine($name)
method. Unlike the
getHeader($name)
method, this method returns a comma-separated string.
$headerValueString = $request->getHeaderLine('Accept');
You can test for the presence of a header with the PSR 7 Request object’s
hasHeader($name)
method.
if ($request->hasHeader('Accept')) {
// Do something
}
Every HTTP request has a body. If you are building a Slim application that
consumes JSON or XML data, you can use the PSR 7 Request object’s
getParsedBody()
method to parse the HTTP request body into a native PHP format.
Slim can parse JSON, XML, and URL-encoded data out of the box.
$parsedBody = $request->getParsedBody();
json_decode($input, true)
.SimpleXMLElement
with simplexml_load_string($input)
.parse_str($input)
.Technically speaking, Slim’s PSR 7 Request object represents the HTTP request
body as an instance of \Psr\Http\Message\StreamInterface
. You can get
the HTTP request body StreamInterface
instance with the PSR 7 Request object’s
getBody()
method. The getBody()
method is preferable if the incoming HTTP
request size is unknown or too large for available memory.
$body = $request->getBody();
The resultant \Psr\Http\Message\StreamInterface
instance provides the following
methods to read and iterate its underlying PHP resource
.
getSize()
tell()
eof()
isSeekable()
seek()
rewind()
isWritable()
write($string)
isReadable()
read($length)
getContents()
getMetadata($key = null)
Slim’s PSR 7 Request implementation provides these additional proprietary methods to help you further inspect the HTTP request.
You can detect XHR requests with the Request object’s isXhr()
method. This
method detects the presence of the X-Requested-With
HTTP request header and
ensures its value is XMLHttpRequest
.
POST /path HTTP/1.1
Host: example.com
Content-type: application/x-www-form-urlencoded
Content-length: 7
X-Requested-With: XMLHttpRequest
foo=bar
if ($request->isXhr()) {
// Do something
}
You can fetch the HTTP request content type with the Request object’s getContentType()
method. This returns the Content-Type
header’s full value as provided by the HTTP client.
$contentType = $request->getContentType();
You may not want the complete Content-Type
header. What if, instead, you only want the media type? You can fetch the HTTP request media type with the Request object’s getMediaType()
method.
$mediaType = $request->getMediaType();
You can fetch the appended media type parameters as an associative array with the Request object’s getMediaTypeParams()
method.
$mediaParams = $request->getMediaTypeParams();
One of the most common media type parameters is the HTTP request character set. The Request object provides a dedicated method to retrieve this media type parameter.
$charset = $request->getContentCharset();
You can fetch the HTTP request content length with the Request object’s getContentLength()
method.
$length = $request->getContentLength();
Sometimes in middleware you require the parameter of your route.
In this example we are checking first that the user is logged in and second that the user has permissions to view the particular video they are attempting to view.
$app->get('/course/{id}', Video::class.":watch")->add(Permission::class)->add(Auth::class);
//.. In the Permission Class's Invoke
/** @var $route \Slim\Route */
$route = $request->getAttribute('route');
$courseId = $route->getArgument('id');
Slim looks as the request’s media type and if it recognises it, will parse it into structured data available via $request->getParsedBody()
. This is usually an array, but is an object for XML media types.
The following media types are recognised and parsed:
If you want Slim to parse content from a different media type then you need to either parse the raw body yourself or register a new media parser. Media parsers are simply callables that accept an $input
string and return a parsed object or array.
Register a new media parser in an application or route middleware. Note that you must register the parser before you try to access the parsed body for the first time.
For example, to automatically parse JSON that is sent with a text/javascript
content type, you register a media type parser in middleware like this:
// Add the middleware
$app->add(function ($request, $response, $next) {
// add media parser
$request->registerMediaTypeParser(
"text/javascript",
function ($input) {
return json_decode($input, true);
}
);
return $next($request, $response);
});