Request API Reference#
Complete reference for Infocyph\Webrick\Request\Request class.
Table of Contents#
Creating Requests#
From Globals (Standard)#
use Infocyph\Webrick\Request\Request;
$request = Request::fromGlobals();
Reads from:
$_SERVER$_GET$_POST$_COOKIE$_FILESphp://input
Manual Construction#
$request = Request::fake(
query: ['page' => 2],
post: ['name' => 'John'],
headers: ['Authorization' => 'Bearer token'],
method: 'GET',
uri: '/users/42',
);
From PSR-7#
use Psr\Http\Message\ServerRequestInterface;
$psrRequest = /* ... */;
$request = new Request(
$psrRequest->getMethod(),
(string) $psrRequest->getUri(),
$psrRequest->getServerParams(),
array_map(static fn(array $v): string => implode(', ', $v), $psrRequest->getHeaders()),
);
HTTP Method#
Get Method#
$method = $request->getMethod(); // 'GET', 'POST', 'PUT', etc.
Check Method#
if ($request->isMethod('POST')) {
// Handle POST
}
// Case-insensitive
$request->isMethod('get'); // true for GET
$request->isMethod('POST'); // true for POST
Common Checks#
$request->isGet(); // GET request
$request->isPost(); // POST request
$request->isPut(); // PUT request
$request->isPatch(); // PATCH request
$request->isDelete(); // DELETE request
$request->isHead(); // HEAD request
$request->isOptions(); // OPTIONS request
Method Override#
Respects X-Http-Method-Override header:
POST /resource
X-Http-Method-Override: PUT
// Treated as PUT
$request->getMethod(); // 'PUT'
URI & Path#
Full URI#
$uri = $request->getUri();
// https://example.com:8080/users/42?page=2#section
Components#
$scheme = $request->getScheme(); // 'https'
$host = $request->getHost(); // 'example.com'
$port = $request->getPort(); // 8080
$path = $request->getPath(); // '/users/42'
$queryString = $request->getQueryString(); // 'page=2'
Path Information#
$path = $request->getPathInfo(); // '/users/42'
$basePath = $request->getBasePath(); // '' or '/app' if in subdirectory
$baseUrl = $request->getBaseUrl(); // 'https://example.com' or 'https://example.com/app'
URL Building#
// Full URL
$url = $request->getSchemeAndHttpHost(); // 'https://example.com:8080'
// With path
$fullUrl = $request->getUri(); // 'https://example.com:8080/users/42?page=2'
HTTPS Detection#
if ($request->isSecure()) {
// HTTPS connection
}
// Respects X-Forwarded-Proto
Query Parameters#
Get All#
$query = $request->query();
// ['page' => '2', 'sort' => 'name']
Get Single#
$page = $request->query('page'); // '2' or null
$page = $request->query('page', 1); // '2' or default 1
$page = (int) $request->query('page', 1); // Type cast
Check Existence#
if ($request->query->has('filter')) {
// Filter parameter exists
}
Get Multiple#
$params = $request->query(['page', 'sort', 'filter']);
// ['page' => '2', 'sort' => 'name', 'filter' => null]
Headers#
Get All#
$headers = $request->getHeaders();
// ['Content-Type' => ['application/json'], 'Accept' => ['*/*']]
Get Single#
$contentType = $request->getHeaderLine('Content-Type');
// 'application/json'
$accept = $request->getHeader('Accept');
// ['application/json', 'text/html'] (array)
Case-Insensitive#
$request->getHeaderLine('content-type'); // Works
$request->getHeaderLine('Content-Type'); // Works
$request->getHeaderLine('CONTENT-TYPE'); // Works
Check Existence#
if ($request->hasHeader('Authorization')) {
$token = $request->getHeaderLine('Authorization');
}
Common Headers#
$contentType = $request->getHeaderLine('Content-Type');
$accept = $request->getHeaderLine('Accept');
$userAgent = $request->getHeaderLine('User-Agent');
$referer = $request->getHeaderLine('Referer');
$auth = $request->getHeaderLine('Authorization');
Body & Input#
Raw Body#
$body = $request->getContent();
// Raw string from php://input
Parsed Input (Any Method)#
// Parsed based on Content-Type
$data = $request->input();
// JSON: Content-Type: application/json
// Returns associative array
// Form: Content-Type: application/x-www-form-urlencoded
// Returns associative array
// Multipart: Content-Type: multipart/form-data
// Returns associative array
Get Specific Field#
$name = $request->input('name'); // null if missing
$name = $request->input('name', 'Guest'); // With default
Nested Fields#
// Input: {"user": {"name": "John", "age": 30}}
$name = $request->input('user.name'); // 'John'
$age = $request->input('user.age'); // 30
JSON Input#
// Content-Type: application/json
// Body: {"name":"John","email":"[email protected]"}
$json = $request->json();
// ['name' => 'John', 'email' => '[email protected]']
$name = $request->json('name'); // 'John'
POST Data#
// Only for POST method + form data
$post = $request->post(); // All POST data
$value = $request->post('field'); // Single field
Input Presence#
if ($request->has('email')) {
// Field exists in input
}
if ($request->filled('email')) {
// Field exists and is not empty
}
// Multiple fields
if ($request->hasAll(['name', 'email'])) {
// All fields exist
}
Get Subset#
// Only these fields
$data = $request->only(['name', 'email']);
// Everything except these
$data = $request->except(['password', 'token']);
Files#
Get All Files#
$files = $request->files();
// Array of UploadedFileInterface objects
Get Single File#
$avatar = $request->file('avatar');
if ($avatar && $avatar->getError() === UPLOAD_ERR_OK) {
$avatar->moveTo('/path/to/uploads/' . $avatar->getClientFilename());
}
File Properties#
$file = $request->file('document');
$name = $file->getClientFilename(); // 'document.pdf'
$size = $file->getSize(); // 1048576 (bytes)
$type = $file->getClientMediaType(); // 'application/pdf'
$error = $file->getError(); // UPLOAD_ERR_OK
$tmpPath = $file->getStream()->getMetadata('uri'); // Temp file path
Multiple Files#
// HTML: <input type="file" name="photos[]" multiple>
$photos = $request->file('photos'); // Array of files
foreach ($photos as $photo) {
if ($photo->getError() === UPLOAD_ERR_OK) {
$photo->moveTo('/uploads/' . $photo->getClientFilename());
}
}
Attributes#
Request attributes store middleware/handler data.
Set Attribute#
$request = $request->withAttribute('user_id', 42);
$request = $request->withAttribute('auth.roles', ['admin', 'editor']);
Get Attribute#
$userId = $request->getAttribute('user_id'); // 42 or null
$userId = $request->getAttribute('user_id', 0); // With default
$roles = $request->getAttribute('auth.roles', []);
Get All Attributes#
$attributes = $request->getAttributes();
Common Attributes (Set by Middleware)#
$request->getAttribute('client_ip'); // Real client IP
$request->getAttribute('auth.user_id'); // Authenticated user
$request->getAttribute('negotiated.type'); // Negotiated media type
$request->getAttribute('locale'); // Negotiated locale
$request->getAttribute('trace.trace_id'); // W3C trace ID
$request->getAttribute('request_id'); // Request ID
Server Variables#
Get All#
$server = $request->getServerParams();
Get Single#
$remoteAddr = $request->server('REMOTE_ADDR');
$scriptName = $request->server('SCRIPT_NAME');
$requestUri = $request->server('REQUEST_URI');
Common Variables#
$request->server('REQUEST_METHOD'); // 'GET'
$request->server('SERVER_PROTOCOL'); // 'HTTP/1.1'
$request->server('REMOTE_ADDR'); // '203.0.113.10'
$request->server('HTTP_HOST'); // 'example.com'
$request->server('REQUEST_URI'); // '/users/42?page=2'
Client Information#
IP Address#
// Real client IP (respects X-Forwarded-For if proxy trusted)
$ip = $request->getAttribute('client_ip');
// Direct connection IP
$ip = $request->server('REMOTE_ADDR');
User Agent#
$userAgent = $request->getHeaderLine('User-Agent');
// 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...'
Referrer#
$referer = $request->getHeaderLine('Referer');
// 'https://google.com/search?q=...'
Accept Languages#
$languages = $request->getHeaderLine('Accept-Language');
// 'en-US,en;q=0.9,es;q=0.8'
// Parsed by NegotiationMiddleware
$locale = $request->getAttribute('locale'); // 'en'
Content Negotiation#
These attributes are set by NegotiationMiddleware:
// Best media type match
$type = $request->getAttribute('negotiated.type');
// 'application/json'
// Best charset match
$charset = $request->getAttribute('negotiated.charset');
// 'utf-8'
// Best locale match
$locale = $request->getAttribute('locale');
// 'en'
PSR-7 Compatibility#
Immutability#
All with* methods return new instance:
$request1 = Request::createFromGlobals();
$request2 = $request1->withHeader('X-Custom', 'value');
// $request1 unchanged
// $request2 has the header
Methods#
// Immutable modifications
$request->withMethod('PUT');
$request->withUri($uri);
$request->withHeader('X-Custom', 'value');
$request->withAddedHeader('Accept', 'application/json');
$request->withoutHeader('X-Debug');
$request->withBody($stream);
$request->withAttribute('key', 'value');
$request->withoutAttribute('key');
$request->withQueryParams(['page' => 2]);
$request->withCookieParams(['session' => 'abc']);
$request->withUploadedFiles($files);
$request->withParsedBody($data);
Common Patterns#
Extract Route Parameters#
// In handler (after routing)
Route::get('/users/{id:int}', function (Request $r, int $id) {
// $id is automatically injected
return Response::json(['id' => $id]);
});
Validate Input#
Route::post('/users', function (Request $r) {
$data = $r->input();
if (!isset($data['email']) || !filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
return Response::json(['error' => 'Invalid email'], 400);
}
// Process...
});
Check Authentication#
Route::get('/profile', function (Request $r) {
$userId = $r->getAttribute('auth.user_id');
if (!$userId) {
return Response::json(['error' => 'Not authenticated'], 401);
}
$user = UserRepository::find($userId);
return Response::json($user);
});
Content Type Branching#
Route::post('/data', function (Request $r) {
$contentType = $r->getHeaderLine('Content-Type');
if (str_contains($contentType, 'application/json')) {
$data = $r->json();
} elseif (str_contains($contentType, 'application/x-www-form-urlencoded')) {
$data = $r->post();
} else {
return Response::json(['error' => 'Unsupported media type'], 415);
}
// Process $data...
});
Debug Request#
Route::get('/__debug/request', function (Request $r) {
return Response::json([
'method' => $r->getMethod(),
'uri' => $r->getUri(),
'headers' => $r->getHeaders(),
'query' => $r->query(),
'input' => $r->input(),
'cookies' => $r->getCookieParams(),
'attributes' => $r->getAttributes(),
'server' => $r->getServerParams(),
]);
});
Method Summary#
HTTP Method#
getMethod(): stringisMethod(string $method): boolisGet(): boolisPost(): boolisPut(): boolisPatch(): boolisDelete(): boolisHead(): boolisOptions(): bool
URI#
getUri(): stringgetScheme(): stringgetHost(): stringgetPort(): intgetPath(): stringgetPathInfo(): stringgetQueryString(): stringgetBaseUrl(): stringgetSchemeAndHttpHost(): stringisSecure(): bool
Query#
query(?string $key = null, mixed $default = null): mixedgetQueryParams(): array
Headers#
getHeaders(): arrayhasHeader(string $name): boolgetHeader(string $name): arraygetHeaderLine(string $name): string
Body#
getContent(): stringinput(?string $key = null, mixed $default = null): mixedjson(?string $key = null, mixed $default = null): mixedpost(?string $key = null, mixed $default = null): mixedhas(string|array $keys): boolhasAll(array $keys): boolfilled(string $key): boolonly(array $keys): arrayexcept(array $keys): array
Files#
files(): arrayfile(string $key): ?UploadedFileInterface
Cookies#
getCookieParams(): arraycookie(string $key, mixed $default = null): mixed
Attributes#
getAttributes(): arraygetAttribute(string $name, mixed $default = null): mixedwithAttribute(string $name, mixed $value): staticwithoutAttribute(string $name): static
Server#
getServerParams(): arrayserver(string $key, mixed $default = null): mixed
PSR-7 Compatibility#
withMethod(string $method): staticwithUri(UriInterface $uri): staticwithHeader(string $name, $value): staticwithAddedHeader(string $name, $value): staticwithoutHeader(string $name): staticwithBody(StreamInterface $body): staticwithQueryParams(array $query): staticwithCookieParams(array $cookies): staticwithUploadedFiles(array $files): staticwithParsedBody($data): static