sms-store/src/App/Action/AbstractAction.php

161 lines
4.7 KiB
PHP
Raw Normal View History

2017-09-03 17:51:59 +02:00
<?php
declare(strict_types=1);
2017-09-03 17:51:59 +02:00
namespace App\Action;
use Psr\Http\Message\ResponseInterface;
2017-09-03 17:51:59 +02:00
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
2017-09-03 17:51:59 +02:00
use Zend\Diactoros\Response\JsonResponse;
use Zend\Json\Json;
abstract class AbstractAction implements RequestHandlerInterface
2017-09-03 17:51:59 +02:00
{
const IDENTIFIER_NAME = 'id';
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)
? $this->get($request)
: $this->getList($request);
2017-09-03 17:51:59 +02:00
case 'POST':
return $this->create($request);
2017-09-03 17:51:59 +02:00
case 'PUT':
return $this->update($request);
2017-09-03 17:51:59 +02:00
case 'DELETE':
return isset($id)
? $this->delete($request)
: $this->deleteList($request);
2017-09-03 17:51:59 +02:00
case 'HEAD':
return $this->head($request);
2017-09-03 17:51:59 +02:00
case 'OPTIONS':
return $this->options($request);
2017-09-03 17:51:59 +02:00
case 'PATCH':
return $this->patch($request);
default:
return $this->createResponse(['content' => 'Method not allowed'], 405);
2017-09-03 17:51:59 +02:00
}
}
public function get(ServerRequestInterface $request): ResponseInterface
2017-09-03 17:51:59 +02:00
{
return $this->createResponse(['content' => 'Method not allowed'], 405);
}
public function getList(ServerRequestInterface $request): ResponseInterface
2017-09-03 17:51:59 +02:00
{
return $this->createResponse(['content' => 'Method not allowed'], 405);
}
public function create(ServerRequestInterface $request): ResponseInterface
2017-09-03 17:51:59 +02:00
{
return $this->createResponse(['content' => 'Method not allowed'], 405);
}
public function update(ServerRequestInterface $request): ResponseInterface
2017-09-03 17:51:59 +02:00
{
return $this->createResponse(['content' => 'Method not allowed'], 405);
}
public function delete(ServerRequestInterface $request): ResponseInterface
2017-09-03 17:51:59 +02:00
{
return $this->createResponse(['content' => 'Method not allowed'], 405);
}
public function deleteList(ServerRequestInterface $request): ResponseInterface
2017-09-03 17:51:59 +02:00
{
return $this->createResponse(['content' => 'Method not allowed'], 405);
}
public function head(ServerRequestInterface $request): ResponseInterface
2017-09-03 17:51:59 +02:00
{
return $this->createResponse(['content' => 'Method not allowed'], 405);
}
public function options(ServerRequestInterface $request): ResponseInterface
2017-09-03 17:51:59 +02:00
{
return $this->createResponse(['content' => 'Method not allowed'], 405);
}
public function patch(ServerRequestInterface $request): ResponseInterface
2017-09-03 17:51:59 +02:00
{
return $this->createResponse(['content' => 'Method not allowed'], 405);
}
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;
};
}
}