Files
hocusfokus-web/kirby/src/Http/Request/Body.php
Bastian Allgeier 7d168aae58 Upgrade to 3.8.0
2022-10-06 10:11:54 +02:00

116 lines
2.3 KiB
PHP

<?php
namespace Kirby\Http\Request;
/**
* The Body class parses the
* request body and provides a nice
* interface to get values from
* structured bodies (json encoded or form data)
*
* @package Kirby Http
* @author Bastian Allgeier <bastian@getkirby.com>
* @link https://getkirby.com
* @copyright Bastian Allgeier
* @license https://opensource.org/licenses/MIT
*/
class Body
{
use Data;
/**
* The raw body content
*/
protected string|array|null $contents;
/**
* The parsed content as array
*/
protected array|null $data = null;
/**
* Creates a new request body object.
* You can pass your own array or string.
* If null is being passed, the class will
* fetch the body either from the $_POST global
* or from php://input.
*/
public function __construct(array|string|null $contents = null)
{
$this->contents = $contents;
}
/**
* Fetches the raw contents for the body
* or uses the passed contents.
*/
public function contents(): string|array
{
if ($this->contents === null) {
if (empty($_POST) === false) {
$this->contents = $_POST;
} else {
$this->contents = file_get_contents('php://input');
}
}
return $this->contents;
}
/**
* Parses the raw contents once and caches
* the result. The parser will try to convert
* the body with the json decoder first and
* then run parse_str to get some results
* if the json decoder failed.
*/
public function data(): array
{
if (is_array($this->data) === true) {
return $this->data;
}
$contents = $this->contents();
// return content which is already in array form
if (is_array($contents) === true) {
return $this->data = $contents;
}
// try to convert the body from json
$json = json_decode($contents, true);
if (is_array($json) === true) {
return $this->data = $json;
}
if (strstr($contents, '=') !== false) {
// try to parse the body as query string
parse_str($contents, $parsed);
if (is_array($parsed)) {
return $this->data = $parsed;
}
}
return $this->data = [];
}
/**
* Converts the data array back
* to a http query string
*/
public function toString(): string
{
return http_build_query($this->data());
}
/**
* Magic string converter
*/
public function __toString(): string
{
return $this->toString();
}
}