Request
Your Slim app’s routes and middleware are given a PSR-7 request object thatrepresents the current HTTP request received by your web server. The requestobject implements the PSR-7 ServerRequestInterface with which you caninspect and manipulate the HTTP request method, headers, and body.
How to get the Request object
The PSR-7 request object is injected into your Slim application routes as thefirst argument to the route callback like this:
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
$app->get('/hello', function (Request $request, Response $response) {
$response->getBody()->write('Hello World');
return $response;
});
$app->run();
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\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
$app->add(function (ServerRequestInterface $request, RequestHandler $handler) {
return $handler->handle($request);
});
// ...define app routes...
$app->run();
The Request Method
Every HTTP request has a method that is typically one of:
- GET
- POST
- PUT
- DELETE
- HEAD
- PATCH
- OPTIONSYou can inspect the HTTP request’s method with the Request object methodappropriately named
getMethod()
.
$method = $request->getMethod();
It is possible to fake or override the HTTP request method. This isuseful if, for example, you need to mimic a PUT
request using a traditionalweb browser that only supports GET
or POST
requests.
Heads Up! To enable request method overriding the Method Overriding Middleware must be injected into your application.
There are two ways to override the HTTP request method. You can include aMETHOD
parameter in a POST
request’s body. The HTTP request must use theapplication/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 customX-Http-Method-Override
HTTP request header. This works with any HTTP requestcontent type.
POST /path HTTP/1.1
Host: example.com
Content-type: application/json
Content-length: 16
X-Http-Method-Override: PUT
{"data":"value"}
The Request URI
Every HTTP request has a URI that identifies the requested applicationresource. The HTTP request URI has several parts:
- Scheme (e.g.
http
orhttps
) - Host (e.g.
example.com
) - Port (e.g.
80
or443
) - Path (e.g.
/users/1
) - Query string (e.g.
sort=created&dir=asc
)You can fetch the PSR-7 Request object’s URI object with itsgetUri()
method:
$uri = $request->getUri();
The PSR-7 Request object’s URI is itself an object that provides the followingmethods 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()
.
Base Path If your Slim application's front-controller lives in a physical subdirectory beneath your document root directory, you can fetch the HTTP request's physical base path (relative to the document root) with the Uri object's getBasePath()
method. This will be an empty string if the Slim application is installed in the document root's top-most directory.
The Request Headers
Every HTTP request has headers. These are metadata that describe the HTTPrequest but are not visible in the request’s body. Slim’s PSR-7Request object provides several methods to inspect its headers.
Get All Headers
You can fetch all HTTP request headers as an associative array with the PSR-7Request object’s getHeaders()
method. The resultant associative array’s keysare the header names and its values are themselves a numeric array of stringvalues for their respective header name.
$headers = $request->getHeaders();
foreach ($headers as $name => $values) {
echo $name . ": " . implode(", ", $values);
}
Get One Header
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 singleHTTP 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 headerwith the PSR-7 Request object’s getHeaderLine($name)
method. Unlike thegetHeader($name)
method, this method returns a comma-separated string.
$headerValueString = $request->getHeaderLine('Accept');
Detect Header
You can test for the presence of a header with the PSR-7 Request object’shasHeader($name)
method.
if ($request->hasHeader('Accept')) {
// Do something
}
The Request Body
Every HTTP request has a body. If you are building a Slim application thatconsumes JSON or XML data, you can use the PSR-7 Request object’sgetParsedBody()
method to parse the HTTP request body into a native PHP format. Note that body parsing differs from one PSR-7 implementation to another.
You may need to implement middleware in order to parse the incoming input depending on the PSR-7 implementation you have installed. Here is an example for parsing incoming JSON
input:
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
class JsonBodyParserMiddleware implements MiddlewareInterface
{
public function process(Request $request, RequestHandler $handler): Response
{
$contentType = $request->getHeaderLine('Content-Type');
if (strstr($contentType, 'application/json')) {
$contents = json_decode(file_get_contents('php://input'), true);
if (json_last_error() === JSON_ERROR_NONE) {
$request = $request->withParsedBody($contents);
}
}
return $handler->handle($request);
}
}
$parsedBody = $request->getParsedBody();
Technically speaking, the PSR-7 Request object represents the HTTP requestbody as an instance of Psr\Http\Message\StreamInterface
. You can getthe HTTP request body StreamInterface
instance with the PSR-7 Request object’sgetBody()
method. The getBody()
method is preferable if the incoming HTTPrequest size is unknown or too large for available memory.
$body = $request->getBody();
The resultant Psr\Http\Message\StreamInterface
instance provides the followingmethods to read and iterate its underlying PHP resource
.
- getSize()
- tell()
- eof()
- isSeekable()
- seek()
- rewind()
- isWritable()
- write($string)
- isReadable()
- read($length)
- getContents()
- getMetadata($key = null)
Uploaded Files
The file uploads in $_FILES
are available from the Request object’sgetUploadedFiles()
method. This returns an array keyed by the name of theinput
element.
$files = $request->getUploadedFiles();
Each object in the $files
array is a instance ofPsr\Http\Message\UploadedFileInterface
and supports the following methods:
- getStream()
- moveTo($targetPath)
- getSize()
- getError()
- getClientFilename()
- getClientMediaType()See the cookbook on how to upload files using a POST form.
Request Helpers
Slim’s PSR-7 Request implementation provides these additional proprietary methodsto help you further inspect the HTTP request.
Detect XHR requests
You can detect XHR requests by checking if the header X-Requested-With
is XMLHttpRequest
using the Request’s getHeaderLine()
method.
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->getHeaderLine('X-Requested-With') === 'XMLHttpRequest') {
// Do something
}
Content Type
You can fetch the HTTP request content type with the Request object’s getHeaderLine()
method.
$contentType = $request->getHeaderLine('Content-Type');
Content Length
You can fetch the HTTP request content length with the Request object’s getHeaderLine()
method.
$length = $request->getHeaderLine('Content-Length');
Request Parameter
To fetch single request parameter value. You will need to use getServerParams()
For example, to get a single Server Parameter:
$params = $request->getServerParams();
$authorization = isset($params['HTTP_AUTHORIZATION']) : $params['HTTP_AUTHORIZATION'] : null;
Route Object
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.
<?php
$app
->get('/course/{id}', Video::class.":watch")
->add(PermissionMiddleware::class);
<?php
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Slim\Routing\RouteContext;
class PermissionMiddleware {
public function __invoke(Request $request, RequestHandler $handler) {
$routeContext = RouteContext::fromRequest($request);
$route = $routeContext->getRoute();
$courseId = $route->getArgument('id');
// ...do permission logic...
return $handler->handle($request);
}
}
Attributes
With PSR-7 it is possible to inject objects/values into the request object for further processing. In your applications middleware often need to pass along information to your route closure and the way to do is it is to add it to the request object via an attribute.
Example, Setting a value on your request object.
$app->add(function ($request, $handler) {
// add the session storage to your request as [READ-ONLY]
$request = $request->withAttribute('session', $_SESSION);
return $handler->handle($request);
});
Example, how to retrieve the value.
$app->get('/test', function ($request, $response, $args) {
$session = $request->getAttribute('session'); // get the session from the request
return $response->write('Yay, ' . $session['name']);
});
The request object also has bulk functions as well. $request->getAttributes()
and $request->withAttributes()