This repository has been archived by the owner on Oct 19, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathBaseController.php
132 lines (113 loc) · 3.83 KB
/
BaseController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<?php
/**
* This file remains to the GTFS-REST-API - Copyright (c) 2020.
*
* @author Sebastian Knopf
* @license http://opensource.org/licenses/MIT MIT
*/
namespace App\Controller;
use DI\Container;
use Slim\Http\Response;
use Slim\Http\ServerRequest;
/**
* Base class for all REST API controllers.
*
* @package App\Controller
*/
abstract class BaseController {
/**
* @var string The default selector method.
*/
private static $DEFAULT_SELECTOR = 'all';
/**
* @var object The database orm reference.
*/
protected $orm;
/**
* @var integer The default limit for database queries
*/
protected $requestLimit;
/**
* @var integer The default offset for database queries
*/
protected $requestOffset;
/**
* Constructor method.
*
* @param Container $container The applications dependency container
* @throws \DI\DependencyException
* @throws \DI\NotFoundException
*/
public function __construct(Container $container) {
$this->orm = $container->get('orm');
}
/**
* Invoke method - Always called by the framework when a route is requested by the client.
*
* @param ServerRequest $request The server request instance
* @param Response $response The response instance
* @param array $args The route arguments passed
* @return \Psr\Http\Message\ResponseInterface|Response The final response object
*/
public function __invoke(ServerRequest $request, Response $response, $args) {
$selector = isset($args['selector']) ? $args['selector'] : self::$DEFAULT_SELECTOR;
$selectorMethod = 'get' . $selector;
$postMethod = 'post' . $selector;
$deleteMethod = 'delete' . $selector;
if (method_exists($this, $selectorMethod) && $request->isGet()) {
$this->requestLimit = $request->getParam('limit', 100);
$this->requestOffset = $request->getParam('offset', 0);
$result = $this->jsonResponse($this->$selectorMethod($request));
$response = $response->withJson($result);
} elseif (method_exists($this, $postMethod) && $request->isPost()) {
$result = $this->$postMethod($request);
$response = $response->withJson([
'result' => $result
]);
} elseif (method_exists($this, $deleteMethod) && $request->isDelete()) {
$result = $this->$deleteMethod($request);
$response = $response->withJson([
'result' => $result
]);
} else {
throw new \RuntimeException('controller method ' . $selector . ' does not exist!');
}
return $response;
}
/**
* Adds a result type to the result of any selector method.
*
* @param $result The result from the selector method
* @return array The result object for response
*/
protected function jsonResponse($result) {
$resultType = $this->getResultType();
return [
'result' => [
$resultType => $result
]
];
}
/**
* Determines the result type from the called controller.
*
* @return string The result type
*/
private function getResultType() {
$className = explode('\\', get_called_class());
$typeName = end($className);
$typeName = str_replace('Controller', '', $typeName);
$typeName = strtolower($typeName);
if (substr($typeName, strlen($typeName) - 2, 1) != 's') {
$typeName .= 's';
}
return $typeName;
}
/**
* Default selector method - Must be overridden by all subclasses of BaseController.
*
* @param ServerRequest $request The server request instance
* @return mixed Selector result data
*/
protected abstract function getAll(ServerRequest $request);
}