header = new Header(); $this->header->setL11n($l11n ?? new Localization()); } /** * Set response. * * @param array $response Response to set * * @return void * * @since 1.0.0 */ public function setResponse(array $response) : void { $this->response = $response; } /** * Remove response by ID. * * @param mixed $id Response ID * * @return bool * * @since 1.0.0 */ public function remove($id) : bool { if (isset($this->response[$id])) { unset($this->response[$id]); return true; } return false; } /** * {@inheritdoc} */ public function getBody() : string { return $this->render(); } /** * Generate response based on header. * * @return string * * @since 1.0.0 */ public function render() : string { $types = $this->header->get('Content-Type'); foreach ($types as $type) { if (\stripos($type, MimeType::M_JSON) !== false) { return (string) \json_encode($this->jsonSerialize()); } } return $this->getRaw(); } /** * Generate raw response. * * @return string * * @throws \Exception * * @since 1.0.0 */ private function getRaw() : string { $render = ''; foreach ($this->response as $key => $response) { $render .= StringUtils::stringify($response); } return $this->removeWhitespaceAndLineBreak($render); } /** * Remove whitespace and line break from render * * @param string $render Rendered string * * @return string * * @since 1.0.0 */ private function removeWhitespaceAndLineBreak(string $render) : string { $types = $this->header->get('Content-Type'); if (\stripos($types[0], MimeType::M_HTML) !== false) { return \trim(\preg_replace('/(?s)
.*?<\/pre>(*SKIP)(*F)|(\s{2,}|\n|\t)/', ' ', $render));
}
return $render;
}
/**
* {@inheritdoc}
* @todo: this whole workflow with json got improved a little bit but this part looks bad. do i really need so much code or could i simplify it
*/
public function toArray() : array
{
$result = [];
try {
foreach ($this->response as $key => $response) {
if ($response instanceof View) {
$result += $response->toArray();
} elseif (\is_array($response)) {
$result += $response;
} elseif (\is_scalar($response)) {
$result[] = $response;
} elseif ($response instanceof \JsonSerializable) {
$result[] = $response->jsonSerialize();
} elseif ($response === null) {
continue;
} else {
throw new \Exception('Wrong response type');
}
}
} catch (\Exception $e) {
FileLogger::getInstance('', false)
->error(
FileLogger::MSG_FULL, [
'message' => $e->getMessage(),
'line' => __LINE__,
'file' => self::class,
]
);
$result = [];
} finally {
return $result;
}
}
}