Refactor request handler

This commit is contained in:
Toby Zerner 2019-10-03 15:38:33 +09:30
parent 5e7edec23c
commit 4cb2085987
1 changed files with 9 additions and 22 deletions

View File

@ -62,16 +62,10 @@ final class JsonApi implements RequestHandlerInterface
switch (count($segments)) { switch (count($segments)) {
case 1: case 1:
return $this->handleWithHandler( return $this->handleCollection($request, $segments);
$request,
$this->getCollectionHandler($request, $segments)
);
case 2: case 2:
return $this->handleWithHandler( return $this->handleResource($request, $segments);
$request,
$this->getMemberHandler($request, $segments)
);
case 3: case 3:
// return $this->handleRelated($request, $resource, $model, $segments[2]); // return $this->handleRelated($request, $resource, $model, $segments[2]);
@ -136,49 +130,42 @@ final class JsonApi implements RequestHandlerInterface
return $path; return $path;
} }
private function getCollectionHandler(Request $request, array $segments): RequestHandlerInterface private function handleCollection(Request $request, array $segments): Response
{ {
$resource = $this->getResource($segments[0]); $resource = $this->getResource($segments[0]);
switch ($request->getMethod()) { switch ($request->getMethod()) {
case 'GET': case 'GET':
return new Handler\Index($this, $resource); return (new Handler\Index($this, $resource))->handle($request);
case 'POST': case 'POST':
return new Handler\Create($this, $resource); return (new Handler\Create($this, $resource))->handle($request);
default: default:
throw new MethodNotAllowedException; throw new MethodNotAllowedException;
} }
} }
private function getMemberHandler(Request $request, array $segments): RequestHandlerInterface private function handleResource(Request $request, array $segments): Response
{ {
$resource = $this->getResource($segments[0]); $resource = $this->getResource($segments[0]);
$model = $this->findResource($request, $resource, $segments[1]); $model = $this->findResource($request, $resource, $segments[1]);
switch ($request->getMethod()) { switch ($request->getMethod()) {
case 'PATCH': case 'PATCH':
return new Handler\Update($this, $resource, $model); return (new Handler\Update($this, $resource, $model))->handle($request);
case 'GET': case 'GET':
return new Handler\Show($this, $resource, $model); return (new Handler\Show($this, $resource, $model))->handle($request);
case 'DELETE': case 'DELETE':
return new Handler\Delete($resource, $model); return (new Handler\Delete($resource, $model))->handle($request);
default: default:
throw new MethodNotAllowedException; throw new MethodNotAllowedException;
} }
} }
private function handleWithHandler(Request $request, RequestHandlerInterface $handler)
{
$request = $request->withAttribute('jsonApiHandler', $handler);
return $handler->handle($request);
}
public function error($e) public function error($e)
{ {
if (! $e instanceof ErrorProviderInterface) { if (! $e instanceof ErrorProviderInterface) {