Reading request data and streams - phpgt/Input GitHub Wiki

Input can do more than read HTML form fields. It also gives us access to the raw request body, JSON payloads, and request sections individually.

Reading a single value

Use get() when we want the raw submitted value without converting it:

$search = $input->get("q");

By default this reads from the combined request input. If we want to be explicit, we can choose a section of the request:

$page = $input->get("page", Input::DATA_QUERYSTRING);
$token = $input->get("token", Input::DATA_BODY);

Checking whether a key exists

Use contains() when the difference between "missing" and "present but empty" matters:

if($input->contains("draft")) {
	// The key exists somewhere in the request.
}

There are also section-specific checks:

  • containsQueryStringParameter()
  • containsBodyParameter()
  • containsFile()

Reading all values at once

getAll() returns an InputData object:

$all = $input->getAll();
$query = $input->getAll(Input::DATA_QUERYSTRING);
$body = $input->getAll(Input::DATA_BODY);
$files = $input->getAll(Input::DATA_FILES);

InputData is useful when we want to pass a subset of user input to another class or callback without handing over the whole request object.

Reading JSON request bodies

If the request body contains JSON, use getBodyJson():

$json = $input->getBodyJson();

if($json) {
	$email = $json->getString("email");
}

If the body is not valid JSON, getBodyJson() returns null.

That makes it a good fit when the request might be JSON but we still want to detect invalid payloads in our own application flow.

Reading the raw body stream

To work with the raw request body directly, use getStream():

$stream = $input->getStream();

while(!feof($stream)) {
	$chunk = fread($stream, 1024);
	processBodyChunk($chunk);
}

This is useful for non-form requests, custom formats, large payloads, or situations where another component expects a PSR-7 stream.

Reading PUT upload streams

For PUT requests carrying file data in the body rather than through multipart/form-data, use getPutFileStream():

$stream = $input->getPutFileStream();
$fh = fopen("data/upload.bin", "w");
// memory efficient copy from incoming stream to file, for example purposes only (not really that useful in real world situations)
stream_copy_to_stream($stream, $fh);

This method is only available when the request method is PUT. Calling it for another HTTP method throws StreamNotAvailableException.


Next: triggers and callbacks