Response
As rotas e os middlewares da aplicação recebem um objeto Response PSR 7 que representa a resposta HTTP atual
a ser retornada ao cliente. O objeto de resposta implementa o ResponseInterface
PSR 7 com o qual você pode inspecionar
e manipular o status de resposta HTTP, headers e body.
Como obter o objeto Response
O objeto Response PSR 7 pode ser injetado automaticamente pelo Container de depêndencias em suas rotas como argumento do callback ou nos métodos do seu controller, exemplo:
// src/App/config/routes.php
use \Psr\Http\Message\ResponseInterface as Response;
$app->get('/foo', function (Response $response) {
// Use the PSR 7 $response object
return $response;
});
// src/App/Controllers/DefaultController.php
<?php
namespace App\Controllers;
use Gangoy\Core\Http\Controller\AbastractController;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
class DefaultController extends AbastractController
{
public function index(Request $request, Response $response, $args)
{
// Use the PSR 7 $response object
return $response;
}
}
O objeto Response PSR 7 também é injetado automaticamente pelo Container de depêndencias nos middlewares como o segundo argumento. Veja nosso exemplo de implementação:
// src/App/Middlewares/MyMiddleware.php
<?php
namespace App\Middlewares;
use Gangoy\Core\Http\MiddlewareInterface;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
class MyMiddleware implements MiddlewareInterface
{
/**
* @param Request $request PSR7 request
* @param Response $response PSR7 response
* @param callable $next Next middleware
*
* @return mixed
*/
public function __invoke(Request $request, Response $response, callable $next)
{
// Use the PSR 7 $response object
return $next($request, $response);
}
}
Status
Toda resposta HTTP possui um código de status numérico .
O código de status identifica o tipo de resposta HTTP a ser retornado ao cliente. O código de status padrão do objeto
de Response PSR 7 é 200(OK). Você pode obter o código de status do objeto Response PSR 7 com o método getStatusCode()
.
$status = $response->getStatusCode();
Você pode pegar um objeto Response PSR 7 e atribuir um novo código de status:
$newResponse = $response->withStatus(302);
return $newResponse;
Header
Toda resposta HTTP possui cabeçalhos. Estes são metadados que descrevem a resposta HTTP, mas não são visíveis no corpo da resposta. O objeto Response PSR 7, fornece vários métodos para inspecionar e manipular seus cabeçalhos.
Você pode obter todos os cabeçalhos de resposta HTTP como uma matriz associativa usando o método getHeaders()
.
As chaves da matriz associativa resultante são os nomes de cabeçalho e seus valores
$headers = $response->getHeaders();
foreach ($headers as $name => $values) {
echo $name . ": " . implode(", ", $values);
}
Você pode obter os valores de um único cabeçalho. Isso retorna uma matriz de valores para o nome do cabeçalho dado. Lembre-se, um único cabeçalho HTTP pode ter mais de um valor!
$headerValueArray = $response->getHeader('Access-Control-Allow-Origin');
Você pode testar a presença de um cabeçalho com o hasHeader($name).
if ($response->hasHeader('Access-Control-Allow-Origin')) {
// Do something
}
Você pode definir um valor de cabeçalho com o método withHeader($name, $value)
do objeto Response do PSR 7.
$newResponse = $oldResponse->withHeader('Content-type', 'application/json');
Lembrete
O objeto Response é imutável. Esse método retorna uma cópia do objeto Response que possui o novo valor de cabeçalho. Esse método é destrutivo e ele substitui valores de cabeçalho existentes já associados ao mesmo nome de cabeçalho.
Você pode anexar um valor de cabeçalho com o método withAddedHeader($name, $value)
do objeto Response do PSR 7 .
$newResponse = $oldResponse->withAddedHeader('Allow', 'PUT');
Lembrete
Ao contrário do métodowithHeader()
, o métodowithAddedHeader()
adiciona o novo valor ao conjunto de valores que já existem para o mesmo nome de cabeçalho. O objeto Response é imutável. Esse método retorna uma cópia do objeto Response que possui o valor de cabeçalho anexado.
Você pode remover um cabeçalho com o método withoutHeader($name)
do objeto Response PSR 7.
$newResponse = $oldResponse->withoutHeader('Allow');
Body
Uma resposta HTTP normalmente tem um corpo. Assim como o objeto Request PSR 7, o objeto Response PSR 7 implementa o
corpo como uma instância de \Psr\Http\Message\StreamInterface. Você pode obter a instância do StreamInterface com o corpo
de resposta HTTP através do método getBody()
do objeto Response PSR 7 . O método getBody()
é preferível se o comprimento
da sáida de resposta HTTP for desconhecido ou muito grande para a memória disponível.
$body = $response->getBody();
Após obter o corpo da requisição você escrever e personalizar sua resposta usando o método write()
como no exemplo:
$body = $response->getBody();
$body->write('Hello');
Retornando JSON
O objeto Response que usamos em Gangoy Framework, herda as caracterísiticas do Slim. Com isso, ele possui um método
personalizado withJson($data, $status, $encodingOptions)
para ajudar a simplificar o processo de retorno de dados JSON.
- $data contém a estrutura de dados que você deseja retornar como JSON.
- $status é opcional e pode ser usado para retornar um código HTTP personalizado.
- $encodingOptions é opcional e são as mesmas opções de codificação usadas em
json_encode()
.
Na forma mais simples, os dados JSON podem ser retornados com um código de status HTTP padrão de 200.
$data = array('name' => 'Bob', 'age' => 40);
$newResponse = $oldResponse->withJson($data);
Também podemos retornar dados JSON com um código de status HTTP personalizado.
$data = array('name' => 'Rob', 'age' => 40);
$newResponse = $oldResponse->withJson($data, 201);