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);