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