Your Slim app’s routes and middleware are given a PSR-7 response object that represents the current HTTP response to be returned to the client. The response object implements the PSR-7 ResponseInterface with which you can inspect and manipulate the HTTP response status, headers, and body.
The PSR-7 response object is injected into your Slim application routes as the second 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();
Every HTTP response has a numeric status code. The status code
identifies the type of HTTP response to be returned to the client. The PSR-7
Response object’s default status code is 200
(OK). You can get the PSR-7
Response object’s status code with the getStatusCode()
method like this.
$status = $response->getStatusCode();
You can copy a PSR-7 Response object and assign a new status code like this:
$newResponse = $response->withStatus(302);
Every HTTP response has headers. These are metadata that describe the HTTP response but are not visible in the response’s body. The PSR-7 Response object provides several methods to inspect and manipulate its headers.
You can fetch all HTTP response headers as an associative array with the PSR-7
Response 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 = $response->getHeaders();
foreach ($headers as $name => $values) {
echo $name . ": " . implode(", ", $values);
}
You can get a single header’s value(s) with the PSR-7 Response 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 = $response->getHeader('Vary');
You may also fetch a comma-separated string with all values for a given header
with the PSR-7 Response object’s getHeaderLine($name)
method. Unlike the
getHeader($name)
method, this method returns a comma-separated string.
$headerValueString = $response->getHeaderLine('Vary');
You can test for the presence of a header with the PSR-7 Response object’s
hasHeader($name)
method.
if ($response->hasHeader('Vary')) {
// Do something
}
You can set a header value with the PSR-7 Response object’s
withHeader($name, $value)
method.
$newResponse = $oldResponse->withHeader('Content-type', 'application/json');
You can append a header value with the PSR-7 Response object’s
withAddedHeader($name, $value)
method.
$newResponse = $oldResponse->withAddedHeader('Allow', 'PUT');
withHeader()
method, this method appends
the new value to the set of values that already exist for the same header
name. The Response object is immutable. This method returns a
copy of the Response object that has the appended header value.
You can remove a header with the Response object’s withoutHeader($name)
method.
$newResponse = $oldResponse->withoutHeader('Allow');
An HTTP response typically has a body.
Just like the PSR-7 Request object, the PSR-7 Response object implements
the body as an instance of Psr\Http\Message\StreamInterface
. You can get
the HTTP response body StreamInterface
instance with the PSR-7 Response
object’s getBody()
method. The getBody()
method is preferable if the
outgoing HTTP response length is unknown or too large for available memory.
$body = $response->getBody();
The resultant Psr\Http\Message\StreamInterface
instance provides the following
methods to read from, iterate, and write to its underlying PHP resource
.
Most often, you’ll need to write to the PSR-7 Response object. You can write
content to the StreamInterface
instance with its write()
method like this:
$body = $response->getBody();
$body->write('Hello');
You can also replace the PSR-7 Response object’s body with an entirely new
StreamInterface
instance. This is particularly useful when you want to pipe
content from a remote destination (e.g. the filesystem or a remote API) into
the HTTP response. You can replace the PSR-7 Response object’s body with
its withBody(StreamInterface $body)
method. Its argument MUST be an
instance of Psr\Http\Message\StreamInterface
.
use GuzzleHttp\Psr7\LazyOpenStream;
$newStream = new LazyOpenStream('/path/to/file', 'r');
$newResponse = $oldResponse->withBody($newStream);
In it’s simplest form, JSON data can be returned with a default 200 HTTP status code.
$data = array('name' => 'Bob', 'age' => 40);
$payload = json_encode($data);
$response->getBody()->write($payload);
return $response
->withHeader('Content-Type', 'application/json');
We can also return JSON data with a custom HTTP status code.
$data = array('name' => 'Rob', 'age' => 40);
$payload = json_encode($data);
$response->getBody()->write($payload);
return $response
->withHeader('Content-Type', 'application/json')
->withStatus(201);
You can redirect the HTTP client by using the Location
header.
return $response
->withHeader('Location', 'https://www.example.com')
->withStatus(302);