first version

This commit is contained in:
Bastian Allgeier
2019-01-13 23:17:34 +01:00
commit 01277f79f2
595 changed files with 82913 additions and 0 deletions

218
kirby/src/Cms/Responder.php Executable file
View File

@@ -0,0 +1,218 @@
<?php
namespace Kirby\Cms;
use Kirby\Toolkit\Mime;
use Kirby\Toolkit\Str;
/**
* Global response configuration
*/
class Responder
{
/**
* HTTP status code
*
* @var integer
*/
protected $code = null;
/**
* Response body
*
* @var string
*/
protected $body = null;
/**
* HTTP headers
*
* @var array
*/
protected $headers = [];
/**
* Content type
*
* @var string
*/
protected $type = null;
/**
* Creates and sends the response
*
* @return string
*/
public function __toString(): string
{
return $this->send();
}
/**
* Setter and getter for the response body
*
* @param string $body
* @return string|self
*/
public function body(string $body = null)
{
if ($body === null) {
return $this->body;
}
$this->body = $body;
return $this;
}
/**
* Setter and getter for the status code
*
* @param integer $code
* @return integer|self
*/
public function code(int $code = null)
{
if ($code === null) {
return $this->code;
}
$this->code = $code;
return $this;
}
/**
* Construct response from an array
*
* @param array $response
* @return self
*/
public function fromArray(array $response)
{
$this->body($response['body'] ?? null);
$this->code($response['code'] ?? null);
$this->headers($response['headers'] ?? null);
$this->type($response['type'] ?? null);
}
/**
* Setter and getter for a single header
*
* @param string $key
* @param string|false|null $value
* @return string|self
*/
public function header(string $key, $value = null)
{
if ($value === null) {
return $this->headers[$key] ?? null;
}
if ($value === false) {
unset($this->headers[$key]);
return $this;
}
$this->headers[$key] = $value;
return $this;
}
/**
* Setter and getter for all headers
*
* @param array $headers
* @return array|self
*/
public function headers(array $headers = null)
{
if ($headers === null) {
return $this->headers;
}
$this->headers = $headers;
return $this;
}
/**
* Shortcut to configure a json response
*
* @param array $json
* @return self
*/
public function json(array $json = null)
{
if ($json !== null) {
$this->body(json_encode($json));
}
return $this->type('application/json');
}
/**
* Shortcut to create a redirect response
*
* @param string|null $location
* @param integer|null $code
* @return self
*/
public function redirect(?string $location = null, ?int $code = null)
{
$location = Url::to($location ?? '/');
$location = Url::unIdn($location);
return $this
->header('Location', (string)$location)
->code($code ?? 302);
}
/**
* Creates and returns the response object from the config
*
* @param string|null $body
* @return Response
*/
public function send(string $body = null)
{
if ($body !== null) {
$this->body($body);
}
return new Response($this->toArray());
}
/**
* Converts the response configuration
* to an array
*
* @return array
*/
public function toArray(): array
{
return [
'body' => $this->body,
'code' => $this->code,
'headers' => $this->headers,
'type' => $this->type,
];
}
/**
* Setter and getter for the content type
*
* @param string $type
* @return string|self
*/
public function type(string $type = null)
{
if ($type === null) {
return $this->type;
}
if (Str::contains($type, '/') === false) {
$type = Mime::fromExtension($type);
}
$this->type = $type;
return $this;
}
}