Requisições e Respostas

O PivotPHP usa objetos de mensagem HTTP compatíveis com PSR-7: Request e Response (PivotPHP\Core\Http\Request e PivotPHP\Core\Http\Response).

O Objeto Request

Dados de entrada

$app->post('/usuarios', function($request, $response) {
    // Parâmetro de rota
    $id = $request->param('id');

    // Entrada (query ou corpo), com padrão opcional
    $nome  = $request->input('nome', 'Anônimo');
    $email = $request->get('email');

    // Query string
    $pagina = $request->getQuery('pagina', 1);
    $todos  = $request->getQueryParams();

    // Corpo JSON parseado (stdClass)
    $dados = $request->body();
    $nome  = $dados->nome ?? null;
});

Cabeçalhos

$contentType = $request->header('Content-Type');
$accept      = $request->getHeaderLine('Accept');
$todos       = $request->getHeaders();

if ($request->hasHeader('X-Requested-With')) {
    // requisição AJAX
}

Informações da requisição

$metodo       = $request->getMethod();
$caminho      = $request->getPath();
$ip           = $request->ip();
$userAgent    = $request->userAgent();
$urlCompleta  = $request->fullUrl();

if ($request->isAjax())   { /* ... */ }
if ($request->isSecure()) { /* HTTPS */ }

Upload de arquivos

$app->post('/upload', function($request, $response) {
    if ($request->hasFile('avatar')) {
        $arquivo = $request->file('avatar'); // array do PSR-7 UploadedFile
    }
});

Atributos (PSR-7)

$request = $request->withAttribute('usuario', $usuario);
$usuario = $request->getAttribute('usuario');
$todos   = $request->getAttributes();

O Objeto Response

Respostas básicas

return $response->text('Olá Mundo');
return $response->html('<h1>Olá Mundo</h1>');
return $response->json(['mensagem' => 'Sucesso']);
return $response->send('texto cru');

Códigos de status

return $response->status(201)->json($dados);

$status = $response->getStatusCode();
$razao  = $response->getReasonPhrase();

Não há atalhos por código (ok(), created(), notFound() etc.) — use status($code).

Cabeçalhos

$response = $response->header('X-Custom', 'valor');
$response = $response->withHeader('Content-Type', 'application/json');
$response = $response->withAddedHeader('X-Custom', 'outro');

Cookies

$response = $response->cookie('sessao', $valor, time() + 3600);
$response = $response->clearCookie('sessao');

Redirecionamentos

return $response->redirect('/dashboard');
return $response->redirect('/login', 301);

Não há back() nem dados flash.

Erro e sucesso

return $response->error(404);              // {"error": "Not Found", "code": 404}
return $response->error(422, 'Inválido');  // mensagem customizada
return $response->success($dados);         // resposta de sucesso padronizada

Download / stream

return $response->streamFile('/caminho/arquivo.pdf', [
    'Content-Type' => 'application/pdf',
]);

Trabalhando com JSON

$app->post('/api/usuarios', function($request, $response) {
    $dados = $request->body(); // stdClass

    return $response->json(['status' => 'sucesso']);
});

Não há jsonp(), xml() nem csv().

Melhores Práticas

  1. Sempre retorne a resposta de todo handler.
  2. Use status() para definir códigos HTTP.
  3. Type hint Request/Response para suporte da IDE:
use PivotPHP\Core\Http\Request;
use PivotPHP\Core\Http\Response;

$app->post('/usuarios', function (Request $request, Response $response) {
    return $response->json(['criado' => true]);
});