Skip to main content

Request Handling

PSR-7 Style

Modern routing supports automatic request injection. Add a $request parameter to your handler and use methods like $request->getParsedBody(), $request->getQueryParam(), and $request->getHeaderLine(). See PSR-7 Style for details.

JSON Body

Parse JSON request body with json_body():

use PhpCompatible\Router\Router;
use PhpCompatible\Router\JsonResponse;

Router::post('/api/users', function() {
$data = json_body();

if (empty($data['name'])) {
return JsonResponse::response(HTTP_BAD_REQUEST, array('error' => 'Name required'));
}

$user = create_user($data);
return JsonResponse::response(HTTP_CREATED, array('user' => $user));
});

Form Data

Access POST form data with form_body():

Router::post('/contact', function() {
$form = form_body();
$name = $form['name'];
$email = $form['email'];

send_contact_email($name, $email, $form['message']);
return '<p>Thanks for your message!</p>';
});

File Uploads

Handle file uploads with has_file(), file_body(), and move_file():

Router::post('/upload', function() {
if (!has_file('document')) {
return JsonResponse::response(HTTP_BAD_REQUEST, array('error' => 'No file uploaded'));
}

$file = file_body('document');
move_file('document', '/uploads/' . $file['name']);

return array('uploaded' => $file['name']);
});

Request Headers

Read headers with request_header():

Router::get('/api/protected', function() {
$auth = request_header('Authorization');

if (empty($auth)) {
return JsonResponse::response(HTTP_UNAUTHORIZED, array('error' => 'Unauthorized'));
}

return array('data' => 'secret');
});

Content Negotiation

Check the Accept header with accept():

Router::get('/data', function() {
$data = array('message' => 'Hello');

if (accept(JSON_CONTENT)) {
return $data; // Auto-converted to JSON
} else {
return '<p>' . $data['message'] . '</p>';
}
});

Using ServerRequest

Routes can receive a PSR-7 style request object:

use PhpCompatible\Router\ServerRequest;

Router::get('/users/:id', function(ServerRequest $request) {
$id = $request->getRouteParam(':id');
$page = $request->getQueryParam('page', 1);

return array(
'user_id' => $id,
'page' => $page
);
});

Router::post('/users', function(ServerRequest $request) {
$data = $request->getParsedBody();
$contentType = $request->getHeader('Content-Type');

return array('received' => $data);
});

Query Parameters

// GET /api/users?page=2&limit=10
Router::get('/api/users', function() {
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$limit = isset($_GET['limit']) ? (int)$_GET['limit'] : 20;

$users = get_users_paginated($page, $limit);
return array(
'users' => $users,
'page' => $page,
'limit' => $limit
);
});