2017-09-03 17:51:59 +02:00
|
|
|
<?php
|
|
|
|
|
|
2018-12-03 22:13:57 +01:00
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
2017-09-03 17:51:59 +02:00
|
|
|
namespace App\Action;
|
|
|
|
|
|
2018-07-09 01:01:22 +02:00
|
|
|
use Psr\Http\Message\ResponseInterface;
|
2017-09-03 17:51:59 +02:00
|
|
|
use Psr\Http\Message\ServerRequestInterface;
|
2018-07-09 01:01:22 +02:00
|
|
|
use Psr\Http\Server\RequestHandlerInterface;
|
2020-09-07 20:54:56 +02:00
|
|
|
use Laminas\Diactoros\Response\JsonResponse;
|
|
|
|
|
use Laminas\Json\Json;
|
2017-09-03 17:51:59 +02:00
|
|
|
|
2018-07-09 01:01:22 +02:00
|
|
|
abstract class AbstractAction implements RequestHandlerInterface
|
2017-09-03 17:51:59 +02:00
|
|
|
{
|
|
|
|
|
const IDENTIFIER_NAME = 'id';
|
|
|
|
|
|
2018-07-09 01:01:22 +02:00
|
|
|
public function handle(ServerRequestInterface $request): ResponseInterface
|
2017-09-03 17:51:59 +02:00
|
|
|
{
|
|
|
|
|
$requestMethod = strtoupper($request->getMethod());
|
|
|
|
|
$id = $request->getAttribute(static::IDENTIFIER_NAME);
|
|
|
|
|
|
|
|
|
|
switch ($requestMethod) {
|
|
|
|
|
case 'GET':
|
|
|
|
|
return isset($id)
|
2018-07-09 01:01:22 +02:00
|
|
|
? $this->get($request)
|
|
|
|
|
: $this->getList($request);
|
2017-09-03 17:51:59 +02:00
|
|
|
case 'POST':
|
2018-07-09 01:01:22 +02:00
|
|
|
return $this->create($request);
|
2017-09-03 17:51:59 +02:00
|
|
|
case 'PUT':
|
2018-07-09 01:01:22 +02:00
|
|
|
return $this->update($request);
|
2017-09-03 17:51:59 +02:00
|
|
|
case 'DELETE':
|
|
|
|
|
return isset($id)
|
2018-07-09 01:01:22 +02:00
|
|
|
? $this->delete($request)
|
|
|
|
|
: $this->deleteList($request);
|
2017-09-03 17:51:59 +02:00
|
|
|
case 'HEAD':
|
2018-07-09 01:01:22 +02:00
|
|
|
return $this->head($request);
|
2017-09-03 17:51:59 +02:00
|
|
|
case 'OPTIONS':
|
2018-07-09 01:01:22 +02:00
|
|
|
return $this->options($request);
|
2017-09-03 17:51:59 +02:00
|
|
|
case 'PATCH':
|
2018-07-09 01:01:22 +02:00
|
|
|
return $this->patch($request);
|
2018-12-03 22:13:57 +01:00
|
|
|
default:
|
|
|
|
|
return $this->createResponse(['content' => 'Method not allowed'], 405);
|
2017-09-03 17:51:59 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-09 01:01:22 +02:00
|
|
|
public function get(ServerRequestInterface $request): ResponseInterface
|
2017-09-03 17:51:59 +02:00
|
|
|
{
|
|
|
|
|
return $this->createResponse(['content' => 'Method not allowed'], 405);
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-09 01:01:22 +02:00
|
|
|
public function getList(ServerRequestInterface $request): ResponseInterface
|
2017-09-03 17:51:59 +02:00
|
|
|
{
|
|
|
|
|
return $this->createResponse(['content' => 'Method not allowed'], 405);
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-09 01:01:22 +02:00
|
|
|
public function create(ServerRequestInterface $request): ResponseInterface
|
2017-09-03 17:51:59 +02:00
|
|
|
{
|
|
|
|
|
return $this->createResponse(['content' => 'Method not allowed'], 405);
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-09 01:01:22 +02:00
|
|
|
public function update(ServerRequestInterface $request): ResponseInterface
|
2017-09-03 17:51:59 +02:00
|
|
|
{
|
|
|
|
|
return $this->createResponse(['content' => 'Method not allowed'], 405);
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-09 01:01:22 +02:00
|
|
|
public function delete(ServerRequestInterface $request): ResponseInterface
|
2017-09-03 17:51:59 +02:00
|
|
|
{
|
|
|
|
|
return $this->createResponse(['content' => 'Method not allowed'], 405);
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-09 01:01:22 +02:00
|
|
|
public function deleteList(ServerRequestInterface $request): ResponseInterface
|
2017-09-03 17:51:59 +02:00
|
|
|
{
|
|
|
|
|
return $this->createResponse(['content' => 'Method not allowed'], 405);
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-09 01:01:22 +02:00
|
|
|
public function head(ServerRequestInterface $request): ResponseInterface
|
2017-09-03 17:51:59 +02:00
|
|
|
{
|
|
|
|
|
return $this->createResponse(['content' => 'Method not allowed'], 405);
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-09 01:01:22 +02:00
|
|
|
public function options(ServerRequestInterface $request): ResponseInterface
|
2017-09-03 17:51:59 +02:00
|
|
|
{
|
|
|
|
|
return $this->createResponse(['content' => 'Method not allowed'], 405);
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-09 01:01:22 +02:00
|
|
|
public function patch(ServerRequestInterface $request): ResponseInterface
|
2017-09-03 17:51:59 +02:00
|
|
|
{
|
|
|
|
|
return $this->createResponse(['content' => 'Method not allowed'], 405);
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-09 01:01:22 +02:00
|
|
|
final protected function createResponse($data, $status = 200): ResponseInterface
|
2017-09-03 17:51:59 +02:00
|
|
|
{
|
|
|
|
|
return new JsonResponse($data, $status);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* @param ServerRequestInterface $request
|
|
|
|
|
* @return array|object
|
|
|
|
|
*/
|
|
|
|
|
public function getRequestData(ServerRequestInterface $request)
|
|
|
|
|
{
|
|
|
|
|
$body = $request->getParsedBody();
|
|
|
|
|
|
|
|
|
|
if (!empty($body)) {
|
|
|
|
|
return $body;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this->parseRequestData(
|
|
|
|
|
$request->getBody()->getContents(),
|
|
|
|
|
$request->getHeaderLine('content-type')
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* @param string $input
|
|
|
|
|
* @param string $contentType
|
|
|
|
|
* @return mixed
|
|
|
|
|
*/
|
|
|
|
|
private function parseRequestData($input, $contentType)
|
|
|
|
|
{
|
|
|
|
|
$contentTypeParts = preg_split('/\s*[;,]\s*/', $contentType);
|
|
|
|
|
$parser = $this->returnParserContentType($contentTypeParts[0]);
|
|
|
|
|
|
|
|
|
|
return $parser($input);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* @param string $contentType
|
|
|
|
|
* @return callable
|
|
|
|
|
*/
|
|
|
|
|
private function returnParserContentType(string $contentType)
|
|
|
|
|
{
|
|
|
|
|
if ($contentType === 'application/x-www-form-urlencoded') {
|
|
|
|
|
return function ($input) {
|
|
|
|
|
parse_str($input, $data);
|
|
|
|
|
return $data;
|
|
|
|
|
};
|
|
|
|
|
} elseif ($contentType === 'application/json') {
|
|
|
|
|
return function ($input) {
|
|
|
|
|
$jsonDecoder = new Json();
|
|
|
|
|
try {
|
|
|
|
|
return $jsonDecoder->decode($input, Json::TYPE_ARRAY);
|
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
} elseif ($contentType === 'multipart/form-data') {
|
|
|
|
|
return function ($input) {
|
|
|
|
|
return $input;
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return function ($input) {
|
|
|
|
|
return $input;
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|