2020-06-16 08:22:47 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace Benzine\Controllers;
|
|
|
|
|
|
2020-06-19 07:53:59 +00:00
|
|
|
use Benzine\Controllers\Filters\Filter;
|
2020-06-22 19:38:55 +00:00
|
|
|
use Benzine\Exceptions\FilterDecodeException;
|
2020-07-27 02:44:36 +00:00
|
|
|
use Monolog\Logger;
|
2020-06-19 07:53:59 +00:00
|
|
|
use Slim\Psr7\Request;
|
|
|
|
|
use Slim\Psr7\Response;
|
2020-06-16 08:22:47 +00:00
|
|
|
|
|
|
|
|
abstract class Controller
|
|
|
|
|
{
|
2020-07-27 02:44:36 +00:00
|
|
|
protected Logger $logger;
|
|
|
|
|
protected Service $service;
|
|
|
|
|
protected bool $apiExplorerEnabled = true;
|
2020-06-16 08:22:47 +00:00
|
|
|
|
2020-07-27 02:44:36 +00:00
|
|
|
public function __construct(Logger $logger)
|
2020-06-16 08:22:47 +00:00
|
|
|
{
|
2020-07-27 02:44:36 +00:00
|
|
|
$this->logger = $logger;
|
|
|
|
|
$this->logger->debug(sprintf('Entered Controller in %sms', number_format((microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']) * 1000, 2)));
|
2020-06-16 08:22:47 +00:00
|
|
|
}
|
|
|
|
|
|
2020-07-27 02:44:36 +00:00
|
|
|
public function getService(): Service
|
2020-06-16 08:22:47 +00:00
|
|
|
{
|
|
|
|
|
return $this->service;
|
|
|
|
|
}
|
|
|
|
|
|
2020-07-27 02:44:36 +00:00
|
|
|
public function setService(Service $service): self
|
2020-06-16 08:22:47 +00:00
|
|
|
{
|
|
|
|
|
$this->service = $service;
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
2020-07-27 02:44:36 +00:00
|
|
|
public function isApiExplorerEnabled(): bool
|
2020-06-16 08:22:47 +00:00
|
|
|
{
|
|
|
|
|
return $this->apiExplorerEnabled;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function setApiExplorerEnabled(bool $apiExplorerEnabled): self
|
|
|
|
|
{
|
|
|
|
|
$this->apiExplorerEnabled = $apiExplorerEnabled;
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function xmlResponse(\SimpleXMLElement $root, Request $request, Response $response): Response
|
|
|
|
|
{
|
2020-06-22 19:38:55 +00:00
|
|
|
$response->getBody()->write($root->asXML());
|
2020-06-16 08:22:47 +00:00
|
|
|
|
|
|
|
|
return $response->withHeader('Content-type', 'text/xml');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function jsonResponse($json, Request $request, Response $response): Response
|
|
|
|
|
{
|
2020-06-22 19:38:55 +00:00
|
|
|
$content = json_encode($json, JSON_PRETTY_PRINT);
|
|
|
|
|
$response->getBody()->write($content);
|
|
|
|
|
|
|
|
|
|
return $response->withHeader('Content-type', 'application/json');
|
2020-06-16 08:22:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function jsonResponseException(\Exception $e, Request $request, Response $response): Response
|
|
|
|
|
{
|
|
|
|
|
return $this->jsonResponse(
|
|
|
|
|
[
|
|
|
|
|
'Status' => 'Fail',
|
|
|
|
|
'Reason' => $e->getMessage(),
|
|
|
|
|
],
|
|
|
|
|
$request,
|
|
|
|
|
$response
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Decide if a request has a filter attached to it.
|
|
|
|
|
*
|
|
|
|
|
* @throws FilterDecodeException
|
|
|
|
|
*/
|
|
|
|
|
protected function requestHasFilters(Request $request, Response $response): bool
|
|
|
|
|
{
|
|
|
|
|
if ($request->hasHeader('Filter')) {
|
|
|
|
|
$filterText = trim($request->getHeader('Filter')[0]);
|
|
|
|
|
if (!empty($filterText)) {
|
|
|
|
|
$decode = json_decode($filterText);
|
|
|
|
|
if (null !== $decode) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
throw new FilterDecodeException('Could not decode given Filter. Reason: Not JSON. Given: "'.$filterText.'"');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Parse filters header into filter objects.
|
|
|
|
|
*/
|
|
|
|
|
protected function parseFilters(Request $request, Response $response): Filter
|
|
|
|
|
{
|
|
|
|
|
$filter = new Filter();
|
|
|
|
|
$filter->parseFromHeader(json_decode($request->getHeader('Filter')[0], true));
|
|
|
|
|
|
|
|
|
|
return $filter;
|
|
|
|
|
}
|
|
|
|
|
}
|