Response
Your Slim app’s routes and middleware are given a PSR-7 response object thatrepresents the current HTTP response to be returned to the client. The responseobject implements the PSR-7 ResponseInterface with which you caninspect and manipulate the HTTP response status, headers, and body.
How to get the Response object
The PSR-7 response object is injected into your Slim application routes as thesecond 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 (ServerRequest $request, Response $response) {
$response->getBody()->write('Hello World');
return $response;
});
$app->run();
The Response Status
Every HTTP response has a numeric status code. The status codeidentifies the type of HTTP response to be returned to the client. The PSR-7Response object’s default status code is 200
(OK). You can get the PSR-7Response 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);
The Response Headers
Every HTTP response has headers. These are metadata that describe the HTTPresponse but are not visible in the response’s body. The PSR-7Response object provides several methods to inspect and manipulate its headers.
Get All Headers
You can fetch all HTTP response headers as an associative array with the PSR-7Response 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 = $response->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 Response object’sgetHeader($name)
method. This returns an array of values for the given headername. 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 headerwith the PSR-7 Response object’s getHeaderLine($name)
method. Unlike thegetHeader($name)
method, this method returns a comma-separated string.
$headerValueString = $response->getHeaderLine('Vary');
Detect Header
You can test for the presence of a header with the PSR-7 Response object’shasHeader($name)
method.
if ($response->hasHeader('Vary')) {
// Do something
}
Set Header
You can set a header value with the PSR-7 Response object’swithHeader($name, $value)
method.
$newResponse = $oldResponse->withHeader('Content-type', 'application/json');
Reminder
The Response object is immutable. This method returns a copy of the Response object that has the new header value. This method is destructive, and it replaces existing header values already associated with the same header name.
Append Header
You can append a header value with the PSR-7 Response object’swithAddedHeader($name, $value)
method.
$newResponse = $oldResponse->withAddedHeader('Allow', 'PUT');
Reminder
Unlike the 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.
Remove Header
You can remove a header with the Response object’s withoutHeader($name)
method.
$newResponse = $oldResponse->withoutHeader('Allow');
Reminder
The Response object is immutable. This method returns a copy of the Response object that has the appended header value.
The Response Body
An HTTP response typically has a body.
Just like the PSR-7 Request object, the PSR-7 Response object implementsthe body as an instance of Psr\Http\Message\StreamInterface
. You can getthe HTTP response body StreamInterface
instance with the PSR-7 Responseobject’s getBody()
method. The getBody()
method is preferable if theoutgoing HTTP response length is unknown or too large for available memory.
$body = $response->getBody();
The resultant Psr\Http\Message\StreamInterface
instance provides the followingmethods to read from, iterate, and write to its underlying PHP resource
.
- getSize()
- tell()
- eof()
- isSeekable()
- seek()
- rewind()
- isWritable()
- write($string)
- isReadable()
- read($length)
- getContents()
- getMetadata($key = null)Most often, you’ll need to write to the PSR-7 Response object. You can writecontent to the
StreamInterface
instance with itswrite()
method like this:
$body = $response->getBody();
$body->write('Hello');
You can also replace the PSR-7 Response object’s body with an entirely newStreamInterface
instance. This is particularly useful when you want to pipecontent from a remote destination (e.g. the filesystem or a remote API) intothe HTTP response. You can replace the PSR-7 Response object’s body withits withBody(StreamInterface $body)
method. Its argument MUST be aninstance of Psr\Http\Message\StreamInterface
.
use GuzzleHttp\Psr7\LazyOpenStream;
$newStream = new LazyOpenStream('/path/to/file', 'r');
$newResponse = $oldResponse->withBody($newStream);
Reminder
The Response object is immutable. This method returns a copy of the Response object that contains the new body.
Returning JSON
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);
Reminder
The Response object is immutable. This method returns a copy of the Response object that has a new Content-Type header. This method is destructive, and it replaces the existing Content-Type header.
Returning a Redirect
You can redirect the HTTP client by using the Location
header.
return $response
->withHeader('Location', 'https://www.example.com')
->withStatus(302);