Core/src/Controllers/AbstractCrudController.php

126 lines
3.7 KiB
PHP

<?php
namespace Benzine\Controllers;
use Benzine\ORM\Interfaces\ModelInterface;
use Laminas\Db\Adapter\Exception\InvalidQueryException;
use Slim\Psr7\Request;
use Slim\Psr7\Response;
abstract class AbstractCrudController extends AbstractController
{
public function listRequest(Request $request, Response $response): Response
{
$objects = [];
$service = $this->getService();
if ($this->requestHasFilters($request, $response)) {
$filterBehaviours = $this->parseFilters($request, $response);
$foundObjects = $service->getAll(
$filterBehaviours->getLimit(),
$filterBehaviours->getOffset(),
$filterBehaviours->getWheres(),
$filterBehaviours->getOrder(),
$filterBehaviours->getOrderDirection()
);
} else {
$foundObjects = $service->getAll();
}
foreach ($foundObjects as $object) {
$objects[] = $object->__toPublicArray();
}
return $this->jsonResponse(
[
'Status' => 'Okay',
'Action' => 'LIST',
$this->service->getTermPlural() => $objects,
],
$request,
$response
);
}
public function getRequest(Request $request, Response $response, $args): Response
{
$object = $this->getService()->getById($args['id']);
if ($object) {
return $this->jsonResponse(
[
'Status' => 'Okay',
'Action' => 'GET',
$this->service->getTermSingular() => $object->__toArray(),
],
$request,
$response
);
}
return $this->jsonResponse(
[
'Status' => 'Fail',
'Reason' => sprintf(
'No such %s found with id %s',
strtolower($this->service->getTermSingular()),
$args['id']
),
],
$request,
$response
);
}
public function createRequest(Request $request, Response $response, $args): Response
{
$newObjectArray = $request->getParsedBody();
try {
$object = $this->getService()->createFromArray($newObjectArray);
return $this->jsonResponse(
[
'Status' => 'Okay',
'Action' => 'CREATE',
$this->service->getTermSingular() => $object->__toArray(),
],
$request,
$response
);
} catch (InvalidQueryException $iqe) {
return $this->jsonResponseException($iqe, $request, $response);
}
}
public function deleteRequest(Request $request, Response $response, $args): Response
{
/** @var ModelInterface $object */
$object = $this->getService()->getById($args['id']);
if ($object) {
$array = $object->__toArray();
$object->destroy();
return $this->jsonResponse(
[
'Status' => 'Okay',
'Action' => 'DELETE',
$this->service->getTermSingular() => $array,
],
$request,
$response
);
}
return $this->jsonResponse(
[
'Status' => 'Fail',
'Reason' => sprintf(
'No such %s found with id %s',
strtolower($this->service->getTermSingular()),
$args['id']
),
],
$request,
$response
);
}
}