From 7676a026b49ecfd883d96977fb8d41681bcf7fad Mon Sep 17 00:00:00 2001 From: dconco Date: Mon, 15 Jul 2024 22:25:39 +0100 Subject: [PATCH 01/11] Updated Command --- app/controller/template/commands/Commands.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controller/template/commands/Commands.txt b/app/controller/template/commands/Commands.txt index 2571664..38ca67b 100644 --- a/app/controller/template/commands/Commands.txt +++ b/app/controller/template/commands/Commands.txt @@ -1,7 +1,7 @@ Usage: php create [options] [..args] - -h || --help Show list of available commands - -s || --strict Provide a strict class + [-h | --help] Show list of available commands + [-s | --strict] Provide a strict class controller Create a route controller class api-controller Create an API controller class From b2f13ec3daa94343970b2b1e0dfd34fd3a1352e2 Mon Sep 17 00:00:00 2001 From: dconco Date: Tue, 16 Jul 2024 05:26:03 +0100 Subject: [PATCH 02/11] completed middleware and API --- .../Http/interface/ApiInterface.php | 6 + app/controller/api/Api.php | 239 +++++------------- app/controller/api/Resources.php | 183 ++++++++++++++ controller/api/ApiExampleController.php | 7 +- routes/api.php | 12 +- 5 files changed, 270 insertions(+), 177 deletions(-) create mode 100644 app/controller/api/Resources.php diff --git a/app/controller/Http/interface/ApiInterface.php b/app/controller/Http/interface/ApiInterface.php index aca1584..9511719 100644 --- a/app/controller/Http/interface/ApiInterface.php +++ b/app/controller/Http/interface/ApiInterface.php @@ -6,9 +6,15 @@ interface ApiInterface { public static function __callStatic ($method, $args): self; + public function name (string $name): self; + public function route (string $url, string $controller): self; public function middleware (array $middleware): self; + public function define (string $url, string $controller): self; + + public function map (array $rest_url): self; + public function __destruct (); } \ No newline at end of file diff --git a/app/controller/api/Api.php b/app/controller/api/Api.php index ac1bd1c..67d26ab 100644 --- a/app/controller/api/Api.php +++ b/app/controller/api/Api.php @@ -6,52 +6,51 @@ use Exception; use PhpSlides\Route\MapRoute; -use PhpSlides\Controller\Controller; use PhpSlides\Interface\ApiInterface; +use PhpSlides\Http\Resources\ApiResources; use PhpSlides\Interface\MiddlewareInterface; -final class Api extends Controller implements ApiInterface +final class Api extends ApiResources implements ApiInterface { public static string $BASE_URL = '/api/'; private static string $version = 'v1'; - private static array|bool $map_info; - - private static array $allRoutes; - - private static array $regRoute; - - private static ?array $route = null; - - private static ?array $define = null; - - private static ?array $middleware = null; - - public static function __callStatic($method, $args): self + public static function __callStatic ($method, $args): self { - if (str_starts_with($method, 'v')) { + if (str_starts_with($method, 'v')) + { $method_v = str_replace('_', '.', $method); self::$version = $method_v; return new self(); - } else { + } + else + { throw new Exception("Invalid version method `$method`"); } } - public function name(string $name): self + public function name (string $name): self { + if (is_array(end(self::$regRoute))) + { + for ($i = 0; $i < count(end(self::$regRoute)); $i++) + { + add_route_name($name . '::' . $i, end(self::$regRoute)[$i]); + self::$allRoutes[$name . '::' . $i] = end(self::$regRoute)[$i]; + } + } add_route_name($name, end(self::$regRoute)); self::$allRoutes[$name] = end(self::$regRoute); return $this; } - public function route(string $url, string $controller): self + public function route (string $url, string $controller): self { $uri = strtolower( - self::$BASE_URL . self::$version . '/' . trim($url, '/') + self::$BASE_URL . self::$version . '/' . trim($url, '/') ); self::$regRoute[] = $uri; @@ -59,202 +58,104 @@ public function route(string $url, string $controller): self $match = new MapRoute(); self::$map_info = $match->match('dynamic', $uri); - if (self::$map_info) { + if (self::$map_info) + { self::$map_info['method'] = $_SERVER['REQUEST_METHOD']; self::$route = [ - 'url' => $uri, - 'controller' => $controller + 'url' => $uri, + 'controller' => $controller ]; } return $this; } - private function __route(): void - { - print_r(self::__routeSelection()); - exit(0); - } - - private function __routeSelection(Request $request = null) - { - $route = self::$route; - $info = self::$map_info; - - $method = $_SERVER['REQUEST_METHOD']; - $controller = $route['controller']; - - if (!class_exists($controller)) { - http_response_code(405); - throw new Exception( - "Api controller class `$controller` does not exist." - ); - } - - $params = $info['params'] ?? null; - - if (!class_exists($controller)) { - throw new Exception( - "Api controller class does not exist: `$controller`" - ); - } - $cc = new $controller(); - - $r_method = ''; - $method = strtoupper($_SERVER['REQUEST_METHOD']); - - switch ($method) { - case 'GET': - global $r_method; - $r_method = $params !== null ? 'show' : 'index'; - break; - - case 'POST': - $r_method = 'store'; - break; - - case 'PUT': - $r_method = 'update'; - break; - - case 'PATCH': - $r_method = 'patch'; - break; - - case 'DELETE': - $r_method = 'destroy'; - break; - - default: - if (method_exists($cc, '__default')) { - $r_method = 'default'; - } else { - self::log(); - exit('Request method not allowed.'); - } - break; - } - - if ($cc instanceof ApiController) { - if ($request === null) { - $request = new Request($params); - } - - self::log(); - return $cc->$r_method($request); - } else { - throw new Exception( - 'Api controller class must implements `ApiController`' - ); - } - } - - public function middleware(array $middleware): self + public function middleware (array $middleware): self { - if (self::$map_info) { + if (self::$map_info) + { self::$middleware = $middleware; } return $this; } - private function __middleware(): void - { - $middleware = self::$middleware ?? []; - $response = ''; - - $params = self::$map_info['params'] ?? null; - $request = new Request($params); - - for ($i = 0; $i < count((array) $middleware); $i++) { - include_once dirname(__DIR__) . '/../../configs/middlewares.php'; - - if (array_key_exists($middleware[$i], $middlewares)) { - $middleware = $middlewares[$middleware[$i]]; - } else { - throw new Exception( - 'No Registered Middleware as `' . $middleware[$i] . '`' - ); - } - - if (!class_exists($middleware)) { - throw new Exception( - "Middleware class does not exist: `{$middleware}`" - ); - } - $mw = new $middleware(); - - if ($mw instanceof MiddlewareInterface) { - $next = function (Request $request) { - return self::__routeSelection($request); - }; - - $response = $mw->handle($request, $next); - } else { - throw new Exception( - 'Middleware class must implements `MiddlewareInterface`' - ); - } - } - - print_r($response); - self::log(); - exit(); - } - - public function define(string $url, string $controller): self + public function define (string $url, string $controller): self { self::$define = [ - 'url' => $url, - 'controller' => $controller + 'url' => $url, + 'controller' => $controller ]; return $this; } - private function map(array $rest_url): void + public function map (array $rest_url): self { $define = self::$define; - if ($define !== null) { + if ($define !== null) + { $url = $define['url']; $controller = $define['controller']; + $method = []; $regUrl = []; - foreach ($rest_url as $route => $method) { + + foreach ($rest_url as $route => $c_method) + { + $method[] = $c_method[0]; $full_url = $url . $route; $uri = strtolower( - self::$BASE_URL . self::$version . '/' . trim($full_url, '/') + rtrim(self::$BASE_URL, '/') . '/' . self::$version . '/' . trim($full_url, '/') ); $regUrl[] = $uri; - } - self::$regRoute[] = $regUrl; - $match = new MapRoute(); - self::$map_info = $match->match('dynamic', $uri); + $match = new MapRoute(); + self::$map_info = $match->match($c_method[0], $uri); - if (self::$map_info) { - self::$map_info['method'] = $_SERVER['REQUEST_METHOD']; + if (self::$map_info) + { + self::$map = [ + 'url' => $uri, + 'c_method' => ltrim($c_method[1], '@'), + 'controller' => $controller + ]; - self::$route = [ - 'url' => $uri, - 'controller' => $controller - ]; + break; + } + } + + self::$regRoute[] = $regUrl; + + if (!in_array($_SERVER['REQUEST_METHOD'], $method)) + { + http_response_code(405); + self::log(); + exit('Method Not Allowed'); } } + return $this; } - public function __destruct() + public function __destruct () { - if (self::$middleware !== null) { + if (self::$middleware !== null) + { self::__middleware(); } - if (self::$route !== null) { + if (self::$route !== null) + { self::__route(); } + + if (self::$map !== null) + { + self::__map(); + } } -} +} \ No newline at end of file diff --git a/app/controller/api/Resources.php b/app/controller/api/Resources.php new file mode 100644 index 0000000..e8ef8b5 --- /dev/null +++ b/app/controller/api/Resources.php @@ -0,0 +1,183 @@ +$r_method($request); + } + else + { + throw new Exception( + 'Api controller class must implements `ApiController`' + ); + } + } + + protected function __middleware (): void + { + $middleware = self::$middleware ?? []; + $response = ''; + + $params = self::$map_info['params'] ?? null; + $request = new Request($params); + + for ($i = 0; $i < count((array) $middleware); $i++) + { + include_once dirname(__DIR__) . '/../../configs/middlewares.php'; + + if (array_key_exists($middleware[$i], $middlewares)) + { + $middleware = $middlewares[$middleware[$i]]; + } + else + { + throw new Exception( + 'No Registered Middleware as `' . $middleware[$i] . '`' + ); + } + + if (!class_exists($middleware)) + { + throw new Exception( + "Middleware class does not exist: `{$middleware}`" + ); + } + $mw = new $middleware(); + + if ($mw instanceof MiddlewareInterface) + { + $next = function (Request $request) + { + return self::__routeSelection($request); + }; + + $response = $mw->handle($request, $next); + } + else + { + throw new Exception( + 'Middleware class must implements `MiddlewareInterface`' + ); + } + } + + print_r($response); + self::log(); + exit(); + } + + protected function __map (Request $request = null): void + { + print_r(self::__routeSelection($request)); + exit(); + } +} \ No newline at end of file diff --git a/controller/api/ApiExampleController.php b/controller/api/ApiExampleController.php index b7a07d1..86ab0e8 100644 --- a/controller/api/ApiExampleController.php +++ b/controller/api/ApiExampleController.php @@ -11,13 +11,14 @@ final class ApiExampleController implements ApiController { public function index (Request $request) { - return 'Index Method'; + $route = route('example.user::0'); + return "Index Method.\nRoute = $route"; } public function show (Request $request) { $user_id = $request->urlParam()->id; - $route = route('example.user', [ $user_id ]); + $route = route('example.user::1', [ $user_id ]); return "Show Method.\nUser ID = $user_id\nRoute = $route"; } @@ -36,5 +37,7 @@ public function patch (Request $request) public function destroy (Request $request) { + $user_id = $request->urlParam()->id; + return "Deleting User: UserID = $user_id"; } } diff --git a/routes/api.php b/routes/api.php index 1145675..f0e9d4b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -9,9 +9,9 @@ ->middleware(['example'])->name('example.user');*/ Api::v1() - ->define('/example/user', ApiExampleController::class) - ->map([ - '/' => '@index', - '/{id}' => '@show', - '/delete/{id}' => '@destroy' - ])->name('example.user'); + ->define('/example/user', ApiExampleController::class) + ->map([ + '/' => [ GET, '@index' ], + '/{id}' => [ GET, '@show' ], + '/delete/{id}' => [ DELETE, '@destroy' ] + ])->name('example.user'); From a655e748517b0a64e752525a91f8fbe0a1ebf475 Mon Sep 17 00:00:00 2001 From: dconco Date: Tue, 16 Jul 2024 20:57:29 +0100 Subject: [PATCH 03/11] completed api controller with mapping method --- ChangeLog.md | 6 ++ app/mail/Mailer.php | 2 +- controller/api/ApiExampleController.php | 79 +++++++++++-------------- middleware/ExampleMiddleware.php | 34 +++++------ routes/api.php | 12 +--- routes/web.php | 4 +- 6 files changed, 63 insertions(+), 74 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index eb5fcd7..ebe571b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -27,3 +27,9 @@ - Completed API Controller function. - Completed middleware function. + +## Tuesday, July 16 2024 + +- Worked on controller and Middleware +- Added mapping method in Api controller +- Api controller now accepts naming route in mapping method. \ No newline at end of file diff --git a/app/mail/Mailer.php b/app/mail/Mailer.php index f49cd52..754927d 100644 --- a/app/mail/Mailer.php +++ b/app/mail/Mailer.php @@ -1,6 +1,6 @@ urlParam()->id; - $route = route('example.user::1', [ $user_id ]); - - return "Show Method.\nUser ID = $user_id\nRoute = $route"; - } - - public function store (Request $request) - { - } - - public function update (Request $request) - { - } - - public function patch (Request $request) - { - } - - public function destroy (Request $request) - { - $user_id = $request->urlParam()->id; - return "Deleting User: UserID = $user_id"; - } -} +route('/example/user/{id}', ApiExampleController::class) - ->middleware(['example'])->name('example.user');*/ - -Api::v1() - ->define('/example/user', ApiExampleController::class) - ->map([ - '/' => [ GET, '@index' ], - '/{id}' => [ GET, '@show' ], - '/delete/{id}' => [ DELETE, '@destroy' ] - ])->name('example.user'); + ->middleware(['example']) + ->name('example.user'); \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 83cc3d3..1e618af 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,9 +11,7 @@ * -------------------------------------------------------------------- */ Route::redirect('/', '/dashboard'); -Route::view('/dashboard', '::Dashboard') - ->middleware(['example']) - ->name('dashboard'); +Route::view('/dashboard', '::Dashboard'); // Handle not found error pages Route::any('*', view::render('::Errors::404')); From 0c574fe5b72ee139e91fba170fa437dc8c443272 Mon Sep 17 00:00:00 2001 From: dconco Date: Wed, 17 Jul 2024 19:24:51 +0100 Subject: [PATCH 04/11] updated --- app/PhpSlides.php | 249 +--------------------------------- app/controller/api/Api.php | 1 - app/resources/Resources.php | 262 ++++++++++++++++++++++++++++++++++++ 3 files changed, 264 insertions(+), 248 deletions(-) create mode 100644 app/resources/Resources.php diff --git a/app/PhpSlides.php b/app/PhpSlides.php index 3674ad4..48a6e06 100644 --- a/app/PhpSlides.php +++ b/app/PhpSlides.php @@ -19,6 +19,7 @@ use Exception; use PhpSlides\Http\Request; use PhpSlides\Route\MapRoute; +use PhpSlides\Resources\Resources; use PhpSlides\Controller\Controller; use PhpSlides\Interface\RouteInterface; use PhpSlides\Interface\MiddlewareInterface; @@ -42,7 +43,7 @@ * ------------------------------------------------------------------------------- */ -final class Route extends Controller implements RouteInterface +final class Route extends Resources implements RouteInterface { /** * `$log` method prints logs in `.log` file in the root of the project each time any request has been received, when setted to true. @@ -63,33 +64,10 @@ final class Route extends Controller implements RouteInterface */ public static string $root_dir; - /** - * Get's all full request URL - * - * @static $root_dir - * @var string $root_dir - * @return string - */ - public static string $request_uri; - - private static array|bool $map_info = false; - private static array $routes; private static array $route; - private static mixed $action = null; - - private static ?array $middleware = null; - - private static ?array $method = null; - - private static ?array $view = null; - - private static ?string $use = null; - - private static ?string $file = null; - /** * Call all static methods * and initialize them @@ -656,51 +634,6 @@ public function action (mixed $callback): self return $this; } - private function __action (): void - { - $action = self::$action; - - if (array_key_exists('params', self::$map_info)) - { - $GLOBALS['params'] = self::$map_info['params']; - $params_value = self::$map_info['params_value']; - - if (is_callable($action)) - { - $a = $action(...$params_value); - print_r($a); - } - elseif (preg_match('/(?=.*Controller)(?=.*::)/', $action)) - { - self::$use = $action; - $this->__use(); - } - else - { - print_r($action); - } - } - else - { - if (is_callable($action)) - { - print_r($action()); - } - elseif (preg_match('/(?=.*Controller)(?=.*::)/', $action)) - { - self::$use = $action; - $this->__use(); - } - else - { - print_r($action); - } - } - - self::log(); - exit(); - } - /** * Controller method * Work with map controller route @@ -717,43 +650,6 @@ public function use(string $controller): self return $this; } - private function __use (): void - { - $controller = self::$use; - - if (!preg_match('/(?=.*Controller)(?=.*::)/', $controller)) - { - exit('invalid parameter $controller Controller type'); - } - - [ $c_name, $c_method ] = explode('::', $controller); - - $cc = 'PhpSlides\\Controller\\' . $c_name; - - if (class_exists($cc)) - { - if (array_key_exists('params', self::$map_info)) - { - $GLOBALS['params'] = self::$map_info['params']; - $params_value = self::$map_info['params_value']; - - $cc = new $cc(); - print_r($cc->$c_method(...$params_value)); - } - else - { - $cc = new $cc(); - print_r($cc->$c_method()); - } - } - else - { - echo "No class controller found as: `$cc`"; - } - - self::log(); - exit(); - } /** * file method @@ -770,19 +666,6 @@ public function file (string $file): self return $this; } - private function __file (): void - { - $file = self::$file; - - if (array_key_exists('params', self::$map_info)) - { - $GLOBALS['params'] = self::$map_info['params']; - - print_r(view::render($file)); - self::log(); - exit(); - } - } /** * Middleware @@ -796,81 +679,6 @@ public function middleware (array $middleware): self return $this; } - private function __middleware (): void - { - $use = self::$use; - $file = self::$use; - $action = self::$action; - - $view = self::$view; - $method = self::$method; - $middleware = self::$middleware ?? []; - - $params = self::$map_info['params'] ?? null; - $request = new Request($params); - - for ($i = 0; $i < count((array) $middleware); $i++) - { - include_once dirname(__DIR__) . '/configs/middlewares.php'; - - if (array_key_exists($middleware[$i], $middlewares)) - { - $middleware = $middlewares[$middleware[$i]]; - } - else - { - throw new Exception('No Registered Middleware as `' . $middleware[$i] . '`'); - } - - if (!class_exists($middleware)) - { - throw new Exception( - "Middleware class does not exist: `{$middleware}`" - ); - } - $mw = new $middleware(); - - if ($mw instanceof MiddlewareInterface) - { - $next = function () use ($use, $file, $action, $view, $method) - { - if ($use !== null) - { - self::__use(); - } - elseif ($file !== null) - { - self::__file(); - } - elseif ($action !== null) - { - self::__action(); - } - elseif ($view !== null) - { - self::__view(); - } - elseif ($method !== null) - { - self::__method(); - } - else - { - throw new Exception('Cannot use middleware with this method'); - } - }; - - $mw->handle($request, $next); - } - else - { - throw new Exception( - 'Middleware class must implements `MiddlewareInterface`' - ); - } - } - } - /** * --------------------------------------------------------------------------- * @@ -897,51 +705,6 @@ public static function view (array|string $route, string $view): self return new self(); } - private static function __view (): void - { - $route = self::$view['route']; - $view = self::$view['view']; - - /** - * ---------------------------------------- - * | Replacing first and last forward slashes - * | $_REQUEST['uri'] will be empty if req uri is / - * ---------------------------------------- - */ - $uri = []; - $str_route = ''; - $reqUri = strtolower( - preg_replace("/(^\/)|(\/$)/", '', self::$request_uri) - ); - - if (is_array($route)) - { - for ($i = 0; $i < count($route); $i++) - { - $each_route = preg_replace("/(^\/)|(\/$)/", '', $route[$i]); - array_push($uri, strtolower($each_route)); - } - } - else - { - $str_route = strtolower(preg_replace("/(^\/)|(\/$)/", '', $route)); - } - - if (in_array($reqUri, $uri) || $reqUri === $str_route) - { - if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'GET') - { - http_response_code(405); - self::log(); - exit('Method Not Allowed'); - } - - // render view page to browser - print_r(view::render($view)); - self::log(); - exit(); - } - } /** * -------------------------------------------------------------- @@ -1086,14 +849,6 @@ public static function delete (array|string $route, $callback): self return new self(); } - private static function __method (): void - { - $route = self::$method['route']; - $method = self::$method['method']; - $callback = self::$method['callback']; - - self::any($route, $callback, $method); - } public function __destruct () { diff --git a/app/controller/api/Api.php b/app/controller/api/Api.php index 67d26ab..1f692b1 100644 --- a/app/controller/api/Api.php +++ b/app/controller/api/Api.php @@ -8,7 +8,6 @@ use PhpSlides\Route\MapRoute; use PhpSlides\Interface\ApiInterface; use PhpSlides\Http\Resources\ApiResources; -use PhpSlides\Interface\MiddlewareInterface; final class Api extends ApiResources implements ApiInterface { diff --git a/app/resources/Resources.php b/app/resources/Resources.php new file mode 100644 index 0000000..842489c --- /dev/null +++ b/app/resources/Resources.php @@ -0,0 +1,262 @@ +handle($request, $next); + } + else + { + throw new Exception( + 'Middleware class must implements `MiddlewareInterface`' + ); + } + } + } + + protected function __file (): void + { + $file = self::$file; + + if (array_key_exists('params', self::$map_info)) + { + $GLOBALS['params'] = self::$map_info['params']; + + print_r(view::render($file)); + self::log(); + exit(); + } + } + + protected function __use (): void + { + $controller = self::$use; + + if (!preg_match('/(?=.*Controller)(?=.*::)/', $controller)) + { + exit('invalid parameter $controller Controller type'); + } + + [ $c_name, $c_method ] = explode('::', $controller); + + $cc = 'PhpSlides\\Controller\\' . $c_name; + + if (class_exists($cc)) + { + if (array_key_exists('params', self::$map_info)) + { + $GLOBALS['params'] = self::$map_info['params']; + $params_value = self::$map_info['params_value']; + + $cc = new $cc(); + print_r($cc->$c_method(...$params_value)); + } + else + { + $cc = new $cc(); + print_r($cc->$c_method()); + } + } + else + { + echo "No class controller found as: `$cc`"; + } + + self::log(); + exit(); + } + + protected function __action (): void + { + $action = self::$action; + + if (array_key_exists('params', self::$map_info)) + { + $GLOBALS['params'] = self::$map_info['params']; + $params_value = self::$map_info['params_value']; + + if (is_callable($action)) + { + $a = $action(...$params_value); + print_r($a); + } + elseif (preg_match('/(?=.*Controller)(?=.*::)/', $action)) + { + self::$use = $action; + $this->__use(); + } + else + { + print_r($action); + } + } + else + { + if (is_callable($action)) + { + print_r($action()); + } + elseif (preg_match('/(?=.*Controller)(?=.*::)/', $action)) + { + self::$use = $action; + $this->__use(); + } + else + { + print_r($action); + } + } + + self::log(); + exit(); + } +} \ No newline at end of file From cccbd08a7c8a5c46c454f8fbdcf62085f3c20cd2 Mon Sep 17 00:00:00 2001 From: dconco Date: Wed, 17 Jul 2024 19:32:51 +0100 Subject: [PATCH 05/11] updated --- app/PhpSlides.php | 5 +---- app/resources/Resources.php | 3 +++ controller/api/ApiExampleController.php | 14 +++++++------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/PhpSlides.php b/app/PhpSlides.php index 48a6e06..adc3207 100644 --- a/app/PhpSlides.php +++ b/app/PhpSlides.php @@ -17,12 +17,10 @@ namespace PhpSlides; use Exception; -use PhpSlides\Http\Request; use PhpSlides\Route\MapRoute; use PhpSlides\Resources\Resources; use PhpSlides\Controller\Controller; use PhpSlides\Interface\RouteInterface; -use PhpSlides\Interface\MiddlewareInterface; /** * ------------------------------------------------------------------------------- @@ -849,7 +847,6 @@ public static function delete (array|string $route, $callback): self return new self(); } - public function __destruct () { if (self::$middleware !== null) @@ -944,4 +941,4 @@ final public static function render (string $view): mixed exit($e->getMessage()); } } -} +} \ No newline at end of file diff --git a/app/resources/Resources.php b/app/resources/Resources.php index 842489c..937e54d 100644 --- a/app/resources/Resources.php +++ b/app/resources/Resources.php @@ -3,9 +3,12 @@ namespace PhpSlides\Resources; +use Exception; use PhpSlides\view; use PhpSlides\Route; +use PhpSlides\Http\Request; use PhpSlides\Controller\Controller; +use PhpSlides\Interface\MiddlewareInterface; abstract class Resources extends Controller { diff --git a/controller/api/ApiExampleController.php b/controller/api/ApiExampleController.php index 6631648..5780d47 100644 --- a/controller/api/ApiExampleController.php +++ b/controller/api/ApiExampleController.php @@ -9,28 +9,28 @@ final class ApiExampleController implements ApiController { - public function index(Request $request) + public function index (Request $request) { } - public function show(Request $request) + public function show (Request $request) { } - public function store(Request $request) + public function store (Request $request) { } - public function update(Request $request) + public function update (Request $request) { } - public function patch(Request $request) + public function patch (Request $request) { } - public function destroy(Request $request) + public function destroy (Request $request) { - + } } From 7bce4085eda8fc6a99ea0249d1565992cddade6b Mon Sep 17 00:00:00 2001 From: dconco Date: Wed, 17 Jul 2024 19:37:26 +0100 Subject: [PATCH 06/11] updated --- app/controller/api/Api.php | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/app/controller/api/Api.php b/app/controller/api/Api.php index 1f692b1..94d013f 100644 --- a/app/controller/api/Api.php +++ b/app/controller/api/Api.php @@ -9,12 +9,33 @@ use PhpSlides\Interface\ApiInterface; use PhpSlides\Http\Resources\ApiResources; +/** + * The Api class provides a fluent interface to define API routes, + * apply middleware, and manage route mapping. + */ final class Api extends ApiResources implements ApiInterface { + /** + * The base URL for all API routes. Default is '/api/' + * @var string + */ public static string $BASE_URL = '/api/'; + /** + * The API version. Default is 'v1' + * @var string + */ private static string $version = 'v1'; + /** + * Handles static method calls to set the API version dynamically. + * + * @param string $method The method name which starts with 'v' followed by the version number. Use `_` in place of `.` + * @param mixed $args The arguments for the method (not used). + * + * @throws \Exception + * @return \PhpSlides\Http\Api + */ public static function __callStatic ($method, $args): self { if (str_starts_with($method, 'v')) @@ -30,6 +51,12 @@ public static function __callStatic ($method, $args): self } } + /** + * Assigns a name to the last registered route for easier reference. + * + * @param string $name The name to assign to the route. + * @return \PhpSlides\Http\Api + */ public function name (string $name): self { if (is_array(end(self::$regRoute))) From 25132e215e66dea6141ccaa04f7af2a698de91c8 Mon Sep 17 00:00:00 2001 From: dconco Date: Fri, 19 Jul 2024 13:32:49 +0100 Subject: [PATCH 07/11] Make API define() method now working with route; --- app/controller/api/Api.php | 41 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/app/controller/api/Api.php b/app/controller/api/Api.php index 94d013f..06bda2a 100644 --- a/app/controller/api/Api.php +++ b/app/controller/api/Api.php @@ -34,7 +34,7 @@ final class Api extends ApiResources implements ApiInterface * @param mixed $args The arguments for the method (not used). * * @throws \Exception - * @return \PhpSlides\Http\Api + * @return self */ public static function __callStatic ($method, $args): self { @@ -55,7 +55,7 @@ public static function __callStatic ($method, $args): self * Assigns a name to the last registered route for easier reference. * * @param string $name The name to assign to the route. - * @return \PhpSlides\Http\Api + * @return self */ public function name (string $name): self { @@ -73,8 +73,20 @@ public function name (string $name): self return $this; } + /** + * Defines a new route with a URL and a controller. + * + * @param string $url The Base URL of the route. + * @param string $controller The controller handling the route. + * @return self + */ public function route (string $url, string $controller): self { + $define = self::$define; + + // checks if $define is set, then assign $define methods to $url & $controller parameters + $url = ($define !== null) ? (empty($url) ? $define['url'] : $define['url'] . '/' . trim($url, '/')) : $url; + $uri = strtolower( self::$BASE_URL . self::$version . '/' . trim($url, '/') ); @@ -92,11 +104,20 @@ public function route (string $url, string $controller): self 'url' => $uri, 'controller' => $controller ]; + + if ($define !== null && empty($controller)) + self::$route['c_methood'] = $controller; } return $this; } + /** + * Applies middleware to the current route. + * + * @param array $middleware An array of middleware classes. + * @return self + */ public function middleware (array $middleware): self { if (self::$map_info) @@ -107,6 +128,13 @@ public function middleware (array $middleware): self return $this; } + /** + * Defines a base URL and controller for subsequent route mappings. + * + * @param string $url The base URL for the routes. + * @param string $controller The controller handling the routes. + * @return self + */ public function define (string $url, string $controller): self { self::$define = [ @@ -117,6 +145,12 @@ public function define (string $url, string $controller): self return $this; } + /** + * Maps multiple HTTP methods to a URL with their corresponding controller methods. + * + * @param array An associative array where the key is the route and the value is an array with the HTTP method and controller method. + * @return self + */ public function map (array $rest_url): self { $define = self::$define; @@ -167,6 +201,9 @@ public function map (array $rest_url): self return $this; } + /** + * Automatically handles middleware, route, and map finalization when the object is destroyed. + */ public function __destruct () { if (self::$middleware !== null) From 23d3dedc765ef7a8ff18e2272660836574474d5b Mon Sep 17 00:00:00 2001 From: dconco Date: Fri, 19 Jul 2024 13:36:43 +0100 Subject: [PATCH 08/11] Make API define() method now working with route; --- ChangeLog.md | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index ebe571b..4064253 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -2,34 +2,38 @@ ## Tue, July 02 2024 -- Added `asset()` function in `Functions.php` file, and can distinguish to start path from relative path or root path -- `RouteController.php` in `slides_include()` function. -- Removed `::view` and `::root` string and it's functions. -- Added `__ROOT__` constant -- Updated slides_include file to auto clone a file to a generated file. -- Can now use normal relative path in `slides_include()` function. -- Improved in Route Map function, can now use `name()` method in any position. -- Updated Request URL to match both uppercase and lowercase -- Renamed `/routes/route.php` to `/routes/web.php` -- Added named route function to normal route method `POST`, `GET`, `PATCH`, `PUT`, `DELETE`, `VIEW`. +- Added `asset()` function in `Functions.php` file, and can distinguish to start path from relative path or root path +- `RouteController.php` in `slides_include()` function. +- Removed `::view` and `::root` string and it's functions. +- Added `__ROOT__` constant +- Updated slides_include file to auto clone a file to a generated file. +- Can now use normal relative path in `slides_include()` function. +- Improved in Route Map function, can now use `name()` method in any position. +- Updated Request URL to match both uppercase and lowercase +- Renamed `/routes/route.php` to `/routes/web.php` +- Added named route function to normal route method `POST`, `GET`, `PATCH`, `PUT`, `DELETE`, `VIEW`. ## Tue, July 09 2024 -- Change all file names to CamelCase -- Added configuration for Console -- Added Console template for Controller, ApiController, Middleware. +- Change all file names to CamelCase +- Added configuration for Console +- Added Console template for Controller, ApiController, Middleware. ## Thursday, July 11 2024 -- Added Authorization method for getting Basic and Bearer token. +- Added Authorization method for getting Basic and Bearer token. ## Saturday, July 13 2024 -- Completed API Controller function. -- Completed middleware function. +- Completed API Controller function. +- Completed middleware function. ## Tuesday, July 16 2024 - Worked on controller and Middleware - Added mapping method in Api controller -- Api controller now accepts naming route in mapping method. \ No newline at end of file +- Api controller now accepts naming route in mapping method. + +## Friday, July 19 2024 + +- Make API define() method now working with route() method. From 5b6ae498f961994683aa13b91862c2d819661faa Mon Sep 17 00:00:00 2001 From: dconco Date: Fri, 19 Jul 2024 23:33:13 +0100 Subject: [PATCH 09/11] Added more version methods manually --- ChangeLog.md | 5 +- app/auth/AuthHandler.php | 20 +- app/controller/Http/Request.php | 250 ++++++- .../Http/interface/ApiInterface.php | 66 +- .../Http/interface/RequestInterface.php | 215 +++++- app/controller/api/Api.php | 661 ++++++++++++++++-- app/controller/api/Controller.php | 72 +- app/controller/api/Resources.php | 82 +-- app/controller/template/api/ApiController.txt | 8 + controller/api/ApiExampleController.php | 21 +- routes/api.php | 2 +- views/components/Header.php | 92 +-- 12 files changed, 1276 insertions(+), 218 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 4064253..8f4d1a6 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -36,4 +36,7 @@ ## Friday, July 19 2024 -- Make API define() method now working with route() method. +- Make API `define()` method now working with `route()` method. +- Work on `route()` so when using `define()` with `route()` they can pass second parameter in `route()` as controller method for the defined route. +- Added more methods to `Request` class. +- Added documentation to each methods in Request class and interface with Api class and interface. diff --git a/app/auth/AuthHandler.php b/app/auth/AuthHandler.php index 4e6c4a3..053b94e 100644 --- a/app/auth/AuthHandler.php +++ b/app/auth/AuthHandler.php @@ -7,42 +7,42 @@ class AuthHandler { private static $authorizationHeader; - private static function getAuthorizationHeader () + private static function getAuthorizationHeader() { $headers = getallheaders(); self::$authorizationHeader = isset($headers['Authorization']) ? $headers['Authorization'] : null; } + /** * Get Basic Authentication Credentials */ - public static function BasicAuthCredentials (): ?array + public static function BasicAuthCredentials(): ?array { self::getAuthorizationHeader(); - if (self::$authorizationHeader && strpos(self::$authorizationHeader, 'Basic ') === 0) - { + if (self::$authorizationHeader && strpos(self::$authorizationHeader, 'Basic ') === 0) { $base64Credentials = substr(self::$authorizationHeader, 6); $decodedCredentials = base64_decode($base64Credentials); - list( $username, $password ) = explode(':', $decodedCredentials, 2); - return [ 'username' => $username, 'password' => $password ]; + list($username, $password) = explode(':', $decodedCredentials, 2); + return ['username' => $username, 'password' => $password]; } return null; } + /** * Get Bearer Token Authentication */ - public static function BearerToken (): ?string + public static function BearerToken(): ?string { self::getAuthorizationHeader(); - if (self::$authorizationHeader && strpos(self::$authorizationHeader, 'Bearer ') === 0) - { + if (self::$authorizationHeader && strpos(self::$authorizationHeader, 'Bearer ') === 0) { $token = substr(self::$authorizationHeader, 7); return $token; } return null; } -} \ No newline at end of file +} diff --git a/app/controller/Http/Request.php b/app/controller/Http/Request.php index 6a6322f..cb7eb29 100644 --- a/app/controller/Http/Request.php +++ b/app/controller/Http/Request.php @@ -8,34 +8,58 @@ use PhpSlides\Auth\AuthHandler; use PhpSlides\Interface\RequestInterface; +/** + * Class Request + * + * Handles HTTP request data including URL parameters, query strings, headers, authentication, body data, and more. + */ class Request implements RequestInterface { + /** + * @var ?array The URL parameters. + */ protected ?array $param; - public function __construct (?array $urlParam = null) + + /** + * Request constructor. + * + * @param ?array $urlParam Optional URL parameters. + */ + public function __construct(?array $urlParam = null) { $this->param = $urlParam; } - public function urlParam (): object + + /** + * Returns URL parameters as an object. + * + * @return object The URL parameters. + */ + public function urlParam(): object { return (object) $this->param; } - public function urlQuery (): stdClass + + /** + * Parses and returns the query string parameters from the URL. + * + * @return stdClass The parsed query parameters. + */ + public function urlQuery(): stdClass { $cl = new stdClass(); $parsed = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY); - if (!$parsed) - { + if (!$parsed) { return $cl; } $parsed = mb_split('&', $parsed); $i = 0; - while ($i < count($parsed)) - { + while ($i < count($parsed)) { $p = mb_split('=', $parsed[$i]); $key = $p[0]; $value = $p[1] ?? null; @@ -47,13 +71,26 @@ public function urlQuery (): stdClass return $cl; } - public function headers (?string $name = null): array|string + + /** + * Retrieves headers from the request. + * + * @param ?string $name Optional header name to retrieve a specific header. + * @return array|string The headers, or a specific header value if $name is provided. + */ + public function headers(?string $name = null): array|string { $headers = getallheaders(); return !$name ? $headers : htmlspecialchars($headers[$name]); } - public function Auth (): stdClass + + /** + * Retrieves authentication credentials from the request. + * + * @return stdClass The authentication credentials. + */ + public function Auth(): stdClass { $cl = new stdClass(); $cl->basic = AuthHandler::BasicAuthCredentials(); @@ -62,7 +99,13 @@ public function Auth (): stdClass return $cl; } - public function body (): ?array + + /** + * Parses and returns the body of the request as an associative array. + * + * @return ?array The request body data, or null if parsing fails. + */ + public function body(): ?array { $data = json_decode(file_get_contents('php://input'), true); @@ -70,8 +113,7 @@ public function body (): ?array return null; $res = []; - foreach ($data as $key => $value) - { + foreach ($data as $key => $value) { $key = trim(htmlspecialchars($key)); $value = trim(htmlspecialchars($value)); @@ -80,7 +122,14 @@ public function body (): ?array return $res; } - public function get (string $key): ?string + + /** + * Retrieves a GET parameter by key. + * + * @param string $key The key of the GET parameter. + * @return ?string The parameter value, or null if not set. + */ + public function get(string $key): ?string { if (!isset($_GET[$key])) return null; @@ -89,7 +138,14 @@ public function get (string $key): ?string return $data; } - public function post (string $key): ?string + + /** + * Retrieves a POST parameter by key. + * + * @param string $key The key of the POST parameter. + * @return ?string The parameter value, or null if not set. + */ + public function post(string $key): ?string { if (!isset($_POST[$key])) return null; @@ -98,7 +154,14 @@ public function post (string $key): ?string return $data; } - public function request (string $key): ?string + + /** + * Retrieves a request parameter by key from all input sources. + * + * @param string $key The key of the request parameter. + * @return ?string The parameter value, or null if not set. + */ + public function request(string $key): ?string { if (!isset($_REQUEST[$key])) return null; @@ -107,7 +170,14 @@ public function request (string $key): ?string return $data; } - public function files (string $name): ?object + + /** + * Retrieves file data from the request by name. + * + * @param string $name The name of the file input. + * @return ?object File data, or null if not set. + */ + public function files(string $name): ?object { if (!isset($_FILES[$name])) return null; @@ -116,24 +186,49 @@ public function files (string $name): ?object return (object) $files; } - public function cookie (?string $key = null): string|object|null + + /** + * Retrieves a cookie value by key, or all cookies if no key is provided. + * + * @param ?string $key Optional cookie key. + * @return string|object|null The cookie value, all cookies as an object, or null if key is provided but not found. + */ + public function cookie(?string $key = null): string|object|null { if (!$key) return (object) $_COOKIE; return htmlspecialchars($_COOKIE[$key]); } - public function method (): string + + /** + * Retrieves the HTTP method used for the request. + * + * @return string The HTTP method (e.g., GET, POST). + */ + public function method(): string { return $_SERVER['REQUEST_METHOD']; } - public function uri (): string + + /** + * Retrieves the URI from the request. + * + * @return string The URI. + */ + public function uri(): string { return urldecode($_REQUEST['uri']); } - public function url (): object + + /** + * Parses and returns URL components including query and parameters. + * + * @return object The parsed URL components. + */ + public function url(): object { $uri = $this->uri(); $parsed = parse_url($uri); @@ -143,4 +238,117 @@ public function url (): object return (object) $parsed; } -} \ No newline at end of file + + + /** + * Retrieves the client's IP address. + * + * @return string The client's IP address. + */ + public function ip(): string + { + return $_SERVER['REMOTE_ADDR']; + } + + + /** + * Retrieves the client's user agent string. + * + * @return string The user agent string. + */ + public function userAgent(): string + { + return $_SERVER['HTTP_USER_AGENT']; + } + + + /** + * Checks if the request was made via AJAX. + * + * @return bool True if the request is an AJAX request, false otherwise. + */ + public function isAjax(): bool + { + return !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'; + } + + + /** + * Retrieves the URL of the referring page. + * + * @return string|null The referrer URL, or null if not set. + */ + public function referrer(): ?string + { + return isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null; + } + + + /** + * Retrieves the server protocol used for the request. + * + * @return string The server protocol. + */ + public function protocol(): string + { + return $_SERVER['SERVER_PROTOCOL']; + } + + + /** + * Retrieves all input data from GET, POST, and the request body. + * + * @return array The combined input data. + */ + public function all(): array + { + $data = array_merge($_GET, $_POST, $this->body() ?? []); + return array_map('htmlspecialchars', $data); + } + + + /** + * Retrieves a parameter from the $_SERVER array. + * + * @param string $key The key of the server parameter. + * @return string|null The server parameter value, or null if not set. + */ + public function server(string $key): ?string + { + return isset($_SERVER[$key]) ? $_SERVER[$key] : null; + } + + + /** + * Checks if the request method matches a given method. + * + * @param string $method The HTTP method to check. + * @return bool True if the request method matches, false otherwise. + */ + public function isMethod(string $method): bool + { + return strtoupper($this->method()) === strtoupper($method); + } + + + /** + * Checks if the request is made over HTTPS. + * + * @return bool True if the request is HTTPS, false otherwise. + */ + public function isHttps(): bool + { + return isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on'; + } + + + /** + * Retrieves the time when the request was made. + * + * @return int The request time as a Unix timestamp. + */ + public function requestTime(): int + { + return $_SERVER['REQUEST_TIME']; + } +} diff --git a/app/controller/Http/interface/ApiInterface.php b/app/controller/Http/interface/ApiInterface.php index 9511719..4e283a1 100644 --- a/app/controller/Http/interface/ApiInterface.php +++ b/app/controller/Http/interface/ApiInterface.php @@ -4,17 +4,67 @@ interface ApiInterface { - public static function __callStatic ($method, $args): self; + /** + * Handles static method calls to set the API version dynamically. + * + * @param string $method The method name which starts with 'v' followed by the version number. Use `_` in place of `.` + * @param mixed $args The arguments for the method (not used). + * + * @throws \Exception + * @return self + */ + public static function __callStatic($method, $args): self; - public function name (string $name): self; - public function route (string $url, string $controller): self; + /** + * Assigns a name to the last registered route for easier reference. + * + * @param string $name The name to assign to the route. + * @return self + */ + public function name(string $name): self; - public function middleware (array $middleware): self; - public function define (string $url, string $controller): self; + /** + * Defines a new route with a URL and a controller. + * + * @param string $url The Base URL of the route. + * @param string $controller The controller handling the route. + * @return self + */ + public function route(string $url, string $controller): self; - public function map (array $rest_url): self; - public function __destruct (); -} \ No newline at end of file + /** + * Applies middleware to the current route. + * + * @param array $middleware An array of middleware classes. + * @return self + */ + public function middleware(array $middleware): self; + + + /** + * Defines a base URL and controller for subsequent route mappings. + * + * @param string $url The base URL for the routes. + * @param string $controller The controller handling the routes. + * @return self + */ + public function define(string $url, string $controller): self; + + + /** + * Maps multiple HTTP methods to a URL with their corresponding controller methods. + * + * @param array An associative array where the key is the route and the value is an array with the HTTP method and controller method. + * @return self + */ + public function map(array $rest_url): self; + + + /** + * Automatically handles middleware, route, and map finalization when the object is destroyed. + */ + public function __destruct(); +} diff --git a/app/controller/Http/interface/RequestInterface.php b/app/controller/Http/interface/RequestInterface.php index d4a0d74..812cfa2 100644 --- a/app/controller/Http/interface/RequestInterface.php +++ b/app/controller/Http/interface/RequestInterface.php @@ -6,33 +6,204 @@ use stdClass; +/** + * Interface RequestInterface + * + * Defines the methods for handling HTTP request data. + */ interface RequestInterface { - public function __construct (array $routeParam); + public function __construct(array $routeParam); + + + /** + * Returns URL parameters as an object. + * + * @return object The URL parameters. + */ + public function urlParam(): object; + + + /** + * Parses and returns the query string parameters from the URL. + * + * @return stdClass The parsed query parameters. + */ + public function urlQuery(): stdClass; + + + /** + * Retrieves headers from the request. + * + * @param ?string $name Optional header name to retrieve a specific header. + * @return array|string The headers, or a specific header value if $name is provided. + */ + public function headers(?string $name = null): array|string; + + + /** + * Retrieves authentication credentials from the request. + * + * @return stdClass The authentication credentials. + */ + public function Auth(): stdClass; + + + /** + * Parses and returns the body of the request as an associative array. + * + * @return ?array The request body data, or null if parsing fails. + */ + public function body(): ?array; + + + /** + * Retrieves a GET parameter by key. + * + * @param string $key The key of the GET parameter. + * @return ?string The parameter value, or null if not set. + */ + public function get(string $key): ?string; + - public function urlParam (): object; + /** + * Retrieves a POST parameter by key. + * + * @param string $key The key of the POST parameter. + * @return ?string The parameter value, or null if not set. + */ + public function post(string $key): ?string; - public function urlQuery (): stdClass; - public function headers (?string $name): array|string; + /** + * Retrieves a request parameter by key from all input sources. + * + * @param string $key The key of the request parameter. + * @return ?string The parameter value, or null if not set. + */ + public function request(string $key): ?string; - public function Auth (): stdClass; - public function body (): ?array; + /** + * Retrieves file data from the request by name. + * + * @param string $name The name of the file input. + * @return ?object File data, or null if not set. + */ + public function files(string $name): ?object; - public function get (string $name): ?string; - - public function post (string $name): ?string; - - public function request (string $name): ?string; - - public function files (string $name): ?object; - - public function cookie (?string $name): string|object|null; - - public function method (): string; - - public function uri (): string; - - public function url (): object; -} \ No newline at end of file + + /** + * Retrieves a cookie value by key, or all cookies if no key is provided. + * + * @param ?string $key Optional cookie key. + * @return string|object|null The cookie value, all cookies as an object, or null if key is provided but not found. + */ + public function cookie(?string $key = null): string|object|null; + + + /** + * Retrieves the HTTP method used for the request. + * + * @return string The HTTP method (e.g., GET, POST). + */ + public function method(): string; + + + /** + * Retrieves the URI from the request. + * + * @return string The URI. + */ + public function uri(): string; + + + /** + * Parses and returns URL components including query and parameters. + * + * @return object The parsed URL components. + */ + public function url(): object; + + + /** + * Retrieves the client's IP address. + * + * @return string The client's IP address. + */ + public function ip(): string; + + + /** + * Retrieves the client's user agent string. + * + * @return string The user agent string. + */ + public function userAgent(): string; + + + /** + * Checks if the request was made via AJAX. + * + * @return bool True if the request is an AJAX request, false otherwise. + */ + public function isAjax(): bool; + + + /** + * Retrieves the URL of the referring page. + * + * @return string|null The referrer URL, or null if not set. + */ + public function referrer(): ?string; + + + /** + * Retrieves the server protocol used for the request. + * + * @return string The server protocol. + */ + public function protocol(): string; + + + /** + * Retrieves all input data from GET, POST, and the request body. + * + * @return array The combined input data. + */ + public function all(): array; + + + /** + * Retrieves a parameter from the $_SERVER array. + * + * @param string $key The key of the server parameter. + * @return string|null The server parameter value, or null if not set. + */ + public function server(string $key): ?string; + + + /** + * Checks if the request method matches a given method. + * + * @param string $method The HTTP method to check. + * @return bool True if the request method matches, false otherwise. + */ + public function isMethod(string $method): bool; + + + /** + * Checks if the request is made over HTTPS. + * + * @return bool True if the request is HTTPS, false otherwise. + */ + public function isHttps(): bool; + + + /** + * Retrieves the time when the request was made. + * + * @return int The request time as a Unix timestamp. + */ + public function requestTime(): int; +} diff --git a/app/controller/api/Api.php b/app/controller/api/Api.php index 06bda2a..5392e76 100644 --- a/app/controller/api/Api.php +++ b/app/controller/api/Api.php @@ -12,6 +12,12 @@ /** * The Api class provides a fluent interface to define API routes, * apply middleware, and manage route mapping. + * + * @since 1.2.2 + * @category Routing + * @license MIT + * @version 1.2.2 + * @author Dave Conco */ final class Api extends ApiResources implements ApiInterface { @@ -27,6 +33,7 @@ final class Api extends ApiResources implements ApiInterface */ private static string $version = 'v1'; + /** * Handles static method calls to set the API version dynamically. * @@ -36,33 +43,29 @@ final class Api extends ApiResources implements ApiInterface * @throws \Exception * @return self */ - public static function __callStatic ($method, $args): self + public static function __callStatic($method, $args): self { - if (str_starts_with($method, 'v')) - { + if (str_starts_with($method, 'v')) { $method_v = str_replace('_', '.', $method); self::$version = $method_v; return new self(); - } - else - { + } else { throw new Exception("Invalid version method `$method`"); } } + /** * Assigns a name to the last registered route for easier reference. * * @param string $name The name to assign to the route. * @return self */ - public function name (string $name): self + public function name(string $name): self { - if (is_array(end(self::$regRoute))) - { - for ($i = 0; $i < count(end(self::$regRoute)); $i++) - { + if (is_array(end(self::$regRoute))) { + for ($i = 0; $i < count(end(self::$regRoute)); $i++) { add_route_name($name . '::' . $i, end(self::$regRoute)[$i]); self::$allRoutes[$name . '::' . $i] = end(self::$regRoute)[$i]; } @@ -73,6 +76,7 @@ public function name (string $name): self return $this; } + /** * Defines a new route with a URL and a controller. * @@ -80,7 +84,7 @@ public function name (string $name): self * @param string $controller The controller handling the route. * @return self */ - public function route (string $url, string $controller): self + public function route(string $url, string $controller): self { $define = self::$define; @@ -88,7 +92,7 @@ public function route (string $url, string $controller): self $url = ($define !== null) ? (empty($url) ? $define['url'] : $define['url'] . '/' . trim($url, '/')) : $url; $uri = strtolower( - self::$BASE_URL . self::$version . '/' . trim($url, '/') + self::$BASE_URL . self::$version . '/' . trim($url, '/') ); self::$regRoute[] = $uri; @@ -96,38 +100,37 @@ public function route (string $url, string $controller): self $match = new MapRoute(); self::$map_info = $match->match('dynamic', $uri); - if (self::$map_info) - { + if (self::$map_info) { self::$map_info['method'] = $_SERVER['REQUEST_METHOD']; self::$route = [ - 'url' => $uri, - 'controller' => $controller + 'url' => $uri, + 'controller' => $define['controller'] ?? $controller ]; - if ($define !== null && empty($controller)) - self::$route['c_methood'] = $controller; + if ($define !== null && !empty($controller)) + self::$route['c_method'] = trim($controller, '@'); } - return $this; } + /** * Applies middleware to the current route. * * @param array $middleware An array of middleware classes. * @return self */ - public function middleware (array $middleware): self + public function middleware(array $middleware): self { - if (self::$map_info) - { + if (self::$map_info) { self::$middleware = $middleware; } return $this; } + /** * Defines a base URL and controller for subsequent route mappings. * @@ -135,41 +138,40 @@ public function middleware (array $middleware): self * @param string $controller The controller handling the routes. * @return self */ - public function define (string $url, string $controller): self + public function define(string $url, string $controller): self { self::$define = [ - 'url' => $url, - 'controller' => $controller + 'url' => $url, + 'controller' => $controller ]; return $this; } + /** * Maps multiple HTTP methods to a URL with their corresponding controller methods. * * @param array An associative array where the key is the route and the value is an array with the HTTP method and controller method. * @return self */ - public function map (array $rest_url): self + public function map(array $rest_url): self { $define = self::$define; - if ($define !== null) - { + if ($define !== null) { $url = $define['url']; $controller = $define['controller']; $method = []; $regUrl = []; - foreach ($rest_url as $route => $c_method) - { + foreach ($rest_url as $route => $c_method) { $method[] = $c_method[0]; $full_url = $url . $route; $uri = strtolower( - rtrim(self::$BASE_URL, '/') . '/' . self::$version . '/' . trim($full_url, '/') + rtrim(self::$BASE_URL, '/') . '/' . self::$version . '/' . trim($full_url, '/') ); $regUrl[] = $uri; @@ -177,12 +179,11 @@ public function map (array $rest_url): self $match = new MapRoute(); self::$map_info = $match->match($c_method[0], $uri); - if (self::$map_info) - { + if (self::$map_info) { self::$map = [ - 'url' => $uri, - 'c_method' => ltrim($c_method[1], '@'), - 'controller' => $controller + 'url' => $uri, + 'c_method' => ltrim($c_method[1], '@'), + 'controller' => $controller ]; break; @@ -191,8 +192,7 @@ public function map (array $rest_url): self self::$regRoute[] = $regUrl; - if (!in_array($_SERVER['REQUEST_METHOD'], $method)) - { + if (!in_array($_SERVER['REQUEST_METHOD'], $method)) { http_response_code(405); self::log(); exit('Method Not Allowed'); @@ -201,24 +201,593 @@ public function map (array $rest_url): self return $this; } + /** * Automatically handles middleware, route, and map finalization when the object is destroyed. */ - public function __destruct () + public function __destruct() { - if (self::$middleware !== null) - { + if (self::$middleware !== null) { self::__middleware(); } - if (self::$route !== null) - { + if (self::$route !== null) { self::__route(); } - if (self::$map !== null) - { + if (self::$map !== null) { self::__map(); } } + + + /** + * Define an API route for version 1. + * Also in use for defining urls + * + * @return self + */ + public static function v1(): self + { + return self::__callStatic('v1', 0); + } + + public static function v1_0(): self { return self::__callStatic('v1_0', 0); } + public static function v1_1(): self { return self::__callStatic('v1_1', 0); } + public static function v1_1_1(): self { return self::__callStatic('v1_1_1', 0); } + public static function v1_1_2(): self { return self::__callStatic('v1_1_2', 0); } + public static function v1_1_3(): self { return self::__callStatic('v1_1_3', 0); } + public static function v1_1_4(): self { return self::__callStatic('v1_1_4', 0); } + public static function v1_1_5(): self { return self::__callStatic('v1_1_5', 0); } + public static function v1_1_6(): self { return self::__callStatic('v1_1_6', 0); } + public static function v1_1_7(): self { return self::__callStatic('v1_1_7', 0); } + public static function v1_1_8(): self { return self::__callStatic('v1_1_8', 0); } + public static function v1_1_9(): self { return self::__callStatic('v1_1_9', 0); } + public static function v1_2(): self { return self::__callStatic('v1_2', 0); } + public static function v1_2_1(): self { return self::__callStatic('v1_2_1', 0); } + public static function v1_2_2(): self { return self::__callStatic('v1_2_2', 0); } + public static function v1_2_3(): self { return self::__callStatic('v1_2_3', 0); } + public static function v1_2_4(): self { return self::__callStatic('v1_2_4', 0); } + public static function v1_2_5(): self { return self::__callStatic('v1_2_5', 0); } + public static function v1_2_6(): self { return self::__callStatic('v1_2_6', 0); } + public static function v1_2_7(): self { return self::__callStatic('v1_2_7', 0); } + public static function v1_2_8(): self { return self::__callStatic('v1_2_8', 0); } + public static function v1_2_9(): self { return self::__callStatic('v1_2_9', 0); } + public static function v1_3(): self { return self::__callStatic('v1_3', 0); } + public static function v1_3_1(): self { return self::__callStatic('v1_3_1', 0); } + public static function v1_3_2(): self { return self::__callStatic('v1_3_2', 0); } + public static function v1_3_3(): self { return self::__callStatic('v1_3_3', 0); } + public static function v1_3_4(): self { return self::__callStatic('v1_3_4', 0); } + public static function v1_3_5(): self { return self::__callStatic('v1_3_5', 0); } + public static function v1_3_6(): self { return self::__callStatic('v1_3_6', 0); } + public static function v1_3_7(): self { return self::__callStatic('v1_3_7', 0); } + public static function v1_3_8(): self { return self::__callStatic('v1_3_8', 0); } + public static function v1_3_9(): self { return self::__callStatic('v1_3_9', 0); } + public static function v1_4(): self { return self::__callStatic('v1_4', 0); } + public static function v1_4_1(): self { return self::__callStatic('v1_4_1', 0); } + public static function v1_4_2(): self { return self::__callStatic('v1_4_2', 0); } + public static function v1_4_3(): self { return self::__callStatic('v1_4_3', 0); } + public static function v1_4_4(): self { return self::__callStatic('v1_4_4', 0); } + public static function v1_4_5(): self { return self::__callStatic('v1_4_5', 0); } + public static function v1_4_6(): self { return self::__callStatic('v1_4_6', 0); } + public static function v1_4_7(): self { return self::__callStatic('v1_4_7', 0); } + public static function v1_4_8(): self { return self::__callStatic('v1_4_8', 0); } + public static function v1_4_9(): self { return self::__callStatic('v1_4_9', 0); } + public static function v1_5(): self { return self::__callStatic('v1_5', 0); } + public static function v1_5_1(): self { return self::__callStatic('v1_5_1', 0); } + public static function v1_5_2(): self { return self::__callStatic('v1_5_2', 0); } + public static function v1_5_3(): self { return self::__callStatic('v1_5_3', 0); } + public static function v1_5_4(): self { return self::__callStatic('v1_5_4', 0); } + public static function v1_5_5(): self { return self::__callStatic('v1_5_5', 0); } + public static function v1_5_6(): self { return self::__callStatic('v1_5_6', 0); } + public static function v1_5_7(): self { return self::__callStatic('v1_5_7', 0); } + public static function v1_5_8(): self { return self::__callStatic('v1_5_8', 0); } + public static function v1_5_9(): self { return self::__callStatic('v1_5_9', 0); } + public static function v1_6(): self { return self::__callStatic('v1_6', 0); } + public static function v1_6_1(): self { return self::__callStatic('v1_6_1', 0); } + public static function v1_6_2(): self { return self::__callStatic('v1_6_2', 0); } + public static function v1_6_3(): self { return self::__callStatic('v1_6_3', 0); } + public static function v1_6_4(): self { return self::__callStatic('v1_6_4', 0); } + public static function v1_6_5(): self { return self::__callStatic('v1_6_5', 0); } + public static function v1_6_6(): self { return self::__callStatic('v1_6_6', 0); } + public static function v1_6_7(): self { return self::__callStatic('v1_6_7', 0); } + public static function v1_6_8(): self { return self::__callStatic('v1_6_8', 0); } + public static function v1_6_9(): self { return self::__callStatic('v1_6_9', 0); } + public static function v1_7(): self { return self::__callStatic('v1_7', 0); } + public static function v1_7_1(): self { return self::__callStatic('v1_7_1', 0); } + public static function v1_7_2(): self { return self::__callStatic('v1_7_2', 0); } + public static function v1_7_3(): self { return self::__callStatic('v1_7_3', 0); } + public static function v1_7_4(): self { return self::__callStatic('v1_7_4', 0); } + public static function v1_7_5(): self { return self::__callStatic('v1_7_5', 0); } + public static function v1_7_6(): self { return self::__callStatic('v1_7_6', 0); } + public static function v1_7_7(): self { return self::__callStatic('v1_7_7', 0); } + public static function v1_7_8(): self { return self::__callStatic('v1_7_8', 0); } + public static function v1_7_9(): self { return self::__callStatic('v1_7_9', 0); } + public static function v1_8(): self { return self::__callStatic('v1_8', 0); } + public static function v1_8_1(): self { return self::__callStatic('v1_8_1', 0); } + public static function v1_8_2(): self { return self::__callStatic('v1_8_2', 0); } + public static function v1_8_3(): self { return self::__callStatic('v1_8_3', 0); } + public static function v1_8_4(): self { return self::__callStatic('v1_8_4', 0); } + public static function v1_8_5(): self { return self::__callStatic('v1_8_5', 0); } + public static function v1_8_6(): self { return self::__callStatic('v1_8_6', 0); } + public static function v1_8_7(): self { return self::__callStatic('v1_8_7', 0); } + public static function v1_8_8(): self { return self::__callStatic('v1_8_8', 0); } + public static function v1_8_9(): self { return self::__callStatic('v1_8_9', 0); } + public static function v1_9(): self { return self::__callStatic('v1_9', 0); } + public static function v1_9_1(): self { return self::__callStatic('v1_9_1', 0); } + public static function v1_9_2(): self { return self::__callStatic('v1_9_2', 0); } + public static function v1_9_3(): self { return self::__callStatic('v1_9_3', 0); } + public static function v1_9_4(): self { return self::__callStatic('v1_9_4', 0); } + public static function v1_9_5(): self { return self::__callStatic('v1_9_5', 0); } + public static function v1_9_6(): self { return self::__callStatic('v1_9_6', 0); } + public static function v1_9_7(): self { return self::__callStatic('v1_9_7', 0); } + public static function v1_9_8(): self { return self::__callStatic('v1_9_8', 0); } + public static function v1_9_9(): self { return self::__callStatic('v1_9_9', 0); } + + public static function v2(): self { return self::__callStatic('v2', 0); } + public static function v2_0(): self { return self::__callStatic('v2_0', 0); } + public static function v2_1(): self { return self::__callStatic('v2_1', 0); } + public static function v2_1_1(): self { return self::__callStatic('v2_1_1', 0); } + public static function v2_1_2(): self { return self::__callStatic('v2_1_2', 0); } + public static function v2_1_3(): self { return self::__callStatic('v2_1_3', 0); } + public static function v2_1_4(): self { return self::__callStatic('v2_1_4', 0); } + public static function v2_1_5(): self { return self::__callStatic('v2_1_5', 0); } + public static function v2_1_6(): self { return self::__callStatic('v2_1_6', 0); } + public static function v2_1_7(): self { return self::__callStatic('v2_1_7', 0); } + public static function v2_1_8(): self { return self::__callStatic('v2_1_8', 0); } + public static function v2_1_9(): self { return self::__callStatic('v2_1_9', 0); } + public static function v2_2(): self { return self::__callStatic('v2_2', 0); } + public static function v2_2_1(): self { return self::__callStatic('v2_2_1', 0); } + public static function v2_2_2(): self { return self::__callStatic('v2_2_2', 0); } + public static function v2_2_3(): self { return self::__callStatic('v2_2_3', 0); } + public static function v2_2_4(): self { return self::__callStatic('v2_2_4', 0); } + public static function v2_2_5(): self { return self::__callStatic('v2_2_5', 0); } + public static function v2_2_6(): self { return self::__callStatic('v2_2_6', 0); } + public static function v2_2_7(): self { return self::__callStatic('v2_2_7', 0); } + public static function v2_2_8(): self { return self::__callStatic('v2_2_8', 0); } + public static function v2_2_9(): self { return self::__callStatic('v2_2_9', 0); } + public static function v2_3(): self { return self::__callStatic('v2_3', 0); } + public static function v2_3_1(): self { return self::__callStatic('v2_3_1', 0); } + public static function v2_3_2(): self { return self::__callStatic('v2_3_2', 0); } + public static function v2_3_3(): self { return self::__callStatic('v2_3_3', 0); } + public static function v2_3_4(): self { return self::__callStatic('v2_3_4', 0); } + public static function v2_3_5(): self { return self::__callStatic('v2_3_5', 0); } + public static function v2_3_6(): self { return self::__callStatic('v2_3_6', 0); } + public static function v2_3_7(): self { return self::__callStatic('v2_3_7', 0); } + public static function v2_3_8(): self { return self::__callStatic('v2_3_8', 0); } + public static function v2_3_9(): self { return self::__callStatic('v2_3_9', 0); } + public static function v2_4(): self { return self::__callStatic('v2_4', 0); } + public static function v2_4_1(): self { return self::__callStatic('v2_4_1', 0); } + public static function v2_4_2(): self { return self::__callStatic('v2_4_2', 0); } + public static function v2_4_3(): self { return self::__callStatic('v2_4_3', 0); } + public static function v2_4_4(): self { return self::__callStatic('v2_4_4', 0); } + public static function v2_4_5(): self { return self::__callStatic('v2_4_5', 0); } + public static function v2_4_6(): self { return self::__callStatic('v2_4_6', 0); } + public static function v2_4_7(): self { return self::__callStatic('v2_4_7', 0); } + public static function v2_4_8(): self { return self::__callStatic('v2_4_8', 0); } + public static function v2_4_9(): self { return self::__callStatic('v2_4_9', 0); } + public static function v2_5(): self { return self::__callStatic('v2_5', 0); } + public static function v2_5_1(): self { return self::__callStatic('v2_5_1', 0); } + public static function v2_5_2(): self { return self::__callStatic('v2_5_2', 0); } + public static function v2_5_3(): self { return self::__callStatic('v2_5_3', 0); } + public static function v2_5_4(): self { return self::__callStatic('v2_5_4', 0); } + public static function v2_5_5(): self { return self::__callStatic('v2_5_5', 0); } + public static function v2_5_6(): self { return self::__callStatic('v2_5_6', 0); } + public static function v2_5_7(): self { return self::__callStatic('v2_5_7', 0); } + public static function v2_5_8(): self { return self::__callStatic('v2_5_8', 0); } + public static function v2_5_9(): self { return self::__callStatic('v2_5_9', 0); } + public static function v2_6(): self { return self::__callStatic('v2_6', 0); } + public static function v2_6_1(): self { return self::__callStatic('v2_6_1', 0); } + public static function v2_6_2(): self { return self::__callStatic('v2_6_2', 0); } + public static function v2_6_3(): self { return self::__callStatic('v2_6_3', 0); } + public static function v2_6_4(): self { return self::__callStatic('v2_6_4', 0); } + public static function v2_6_5(): self { return self::__callStatic('v2_6_5', 0); } + public static function v2_6_6(): self { return self::__callStatic('v2_6_6', 0); } + public static function v2_6_7(): self { return self::__callStatic('v2_6_7', 0); } + public static function v2_6_8(): self { return self::__callStatic('v2_6_8', 0); } + public static function v2_6_9(): self { return self::__callStatic('v2_6_9', 0); } + public static function v2_7(): self { return self::__callStatic('v2_7', 0); } + public static function v2_7_1(): self { return self::__callStatic('v2_7_1', 0); } + public static function v2_7_2(): self { return self::__callStatic('v2_7_2', 0); } + public static function v2_7_3(): self { return self::__callStatic('v2_7_3', 0); } + public static function v2_7_4(): self { return self::__callStatic('v2_7_4', 0); } + public static function v2_7_5(): self { return self::__callStatic('v2_7_5', 0); } + public static function v2_7_6(): self { return self::__callStatic('v2_7_6', 0); } + public static function v2_7_7(): self { return self::__callStatic('v2_7_7', 0); } + public static function v2_7_8(): self { return self::__callStatic('v2_7_8', 0); } + public static function v2_7_9(): self { return self::__callStatic('v2_7_9', 0); } + public static function v2_8(): self { return self::__callStatic('v2_8', 0); } + public static function v2_8_1(): self { return self::__callStatic('v2_8_1', 0); } + public static function v2_8_2(): self { return self::__callStatic('v2_8_2', 0); } + public static function v2_8_3(): self { return self::__callStatic('v2_8_3', 0); } + public static function v2_8_4(): self { return self::__callStatic('v2_8_4', 0); } + public static function v2_8_5(): self { return self::__callStatic('v2_8_5', 0); } + public static function v2_8_6(): self { return self::__callStatic('v2_8_6', 0); } + public static function v2_8_7(): self { return self::__callStatic('v2_8_7', 0); } + public static function v2_8_8(): self { return self::__callStatic('v2_8_8', 0); } + public static function v2_8_9(): self { return self::__callStatic('v2_8_9', 0); } + public static function v2_9(): self { return self::__callStatic('v2_9', 0); } + public static function v2_9_1(): self { return self::__callStatic('v2_9_1', 0); } + public static function v2_9_2(): self { return self::__callStatic('v2_9_2', 0); } + public static function v2_9_3(): self { return self::__callStatic('v2_9_3', 0); } + public static function v2_9_4(): self { return self::__callStatic('v2_9_4', 0); } + public static function v2_9_5(): self { return self::__callStatic('v2_9_5', 0); } + public static function v2_9_6(): self { return self::__callStatic('v2_9_6', 0); } + public static function v2_9_7(): self { return self::__callStatic('v2_9_7', 0); } + public static function v2_9_8(): self { return self::__callStatic('v2_9_8', 0); } + public static function v2_9_9(): self { return self::__callStatic('v2_9_9', 0); } + + public static function v3(): self { return self::__callStatic('v3', 0); } + public static function v3_0(): self { return self::__callStatic('v3_0', 0); } + public static function v3_1(): self { return self::__callStatic('v3_1', 0); } + public static function v3_1_1(): self { return self::__callStatic('v3_1_1', 0); } + public static function v3_1_2(): self { return self::__callStatic('v3_1_2', 0); } + public static function v3_1_3(): self { return self::__callStatic('v3_1_3', 0); } + public static function v3_1_4(): self { return self::__callStatic('v3_1_4', 0); } + public static function v3_1_5(): self { return self::__callStatic('v3_1_5', 0); } + public static function v3_1_6(): self { return self::__callStatic('v3_1_6', 0); } + public static function v3_1_7(): self { return self::__callStatic('v3_1_7', 0); } + public static function v3_1_8(): self { return self::__callStatic('v3_1_8', 0); } + public static function v3_1_9(): self { return self::__callStatic('v3_1_9', 0); } + public static function v3_2(): self { return self::__callStatic('v3_2', 0); } + public static function v3_2_1(): self { return self::__callStatic('v3_2_1', 0); } + public static function v3_2_2(): self { return self::__callStatic('v3_2_2', 0); } + public static function v3_2_3(): self { return self::__callStatic('v3_2_3', 0); } + public static function v3_2_4(): self { return self::__callStatic('v3_2_4', 0); } + public static function v3_2_5(): self { return self::__callStatic('v3_2_5', 0); } + public static function v3_2_6(): self { return self::__callStatic('v3_2_6', 0); } + public static function v3_2_7(): self { return self::__callStatic('v3_2_7', 0); } + public static function v3_2_8(): self { return self::__callStatic('v3_2_8', 0); } + public static function v3_2_9(): self { return self::__callStatic('v3_2_9', 0); } + public static function v3_3(): self { return self::__callStatic('v3_3', 0); } + public static function v3_3_1(): self { return self::__callStatic('v3_3_1', 0); } + public static function v3_3_2(): self { return self::__callStatic('v3_3_2', 0); } + public static function v3_3_3(): self { return self::__callStatic('v3_3_3', 0); } + public static function v3_3_4(): self { return self::__callStatic('v3_3_4', 0); } + public static function v3_3_5(): self { return self::__callStatic('v3_3_5', 0); } + public static function v3_3_6(): self { return self::__callStatic('v3_3_6', 0); } + public static function v3_3_7(): self { return self::__callStatic('v3_3_7', 0); } + public static function v3_3_8(): self { return self::__callStatic('v3_3_8', 0); } + public static function v3_3_9(): self { return self::__callStatic('v3_3_9', 0); } + public static function v3_4(): self { return self::__callStatic('v3_4', 0); } + public static function v3_4_1(): self { return self::__callStatic('v3_4_1', 0); } + public static function v3_4_2(): self { return self::__callStatic('v3_4_2', 0); } + public static function v3_4_3(): self { return self::__callStatic('v3_4_3', 0); } + public static function v3_4_4(): self { return self::__callStatic('v3_4_4', 0); } + public static function v3_4_5(): self { return self::__callStatic('v3_4_5', 0); } + public static function v3_4_6(): self { return self::__callStatic('v3_4_6', 0); } + public static function v3_4_7(): self { return self::__callStatic('v3_4_7', 0); } + public static function v3_4_8(): self { return self::__callStatic('v3_4_8', 0); } + public static function v3_4_9(): self { return self::__callStatic('v3_4_9', 0); } + public static function v3_5(): self { return self::__callStatic('v3_5', 0); } + public static function v3_5_1(): self { return self::__callStatic('v3_5_1', 0); } + public static function v3_5_2(): self { return self::__callStatic('v3_5_2', 0); } + public static function v3_5_3(): self { return self::__callStatic('v3_5_3', 0); } + public static function v3_5_4(): self { return self::__callStatic('v3_5_4', 0); } + public static function v3_5_5(): self { return self::__callStatic('v3_5_5', 0); } + public static function v3_5_6(): self { return self::__callStatic('v3_5_6', 0); } + public static function v3_5_7(): self { return self::__callStatic('v3_5_7', 0); } + public static function v3_5_8(): self { return self::__callStatic('v3_5_8', 0); } + public static function v3_5_9(): self { return self::__callStatic('v3_5_9', 0); } + public static function v3_6(): self { return self::__callStatic('v3_6', 0); } + public static function v3_6_1(): self { return self::__callStatic('v3_6_1', 0); } + public static function v3_6_2(): self { return self::__callStatic('v3_6_2', 0); } + public static function v3_6_3(): self { return self::__callStatic('v3_6_3', 0); } + public static function v3_6_4(): self { return self::__callStatic('v3_6_4', 0); } + public static function v3_6_5(): self { return self::__callStatic('v3_6_5', 0); } + public static function v3_6_6(): self { return self::__callStatic('v3_6_6', 0); } + public static function v3_6_7(): self { return self::__callStatic('v3_6_7', 0); } + public static function v3_6_8(): self { return self::__callStatic('v3_6_8', 0); } + public static function v3_6_9(): self { return self::__callStatic('v3_6_9', 0); } + public static function v3_7(): self { return self::__callStatic('v3_7', 0); } + public static function v3_7_1(): self { return self::__callStatic('v3_7_1', 0); } + public static function v3_7_2(): self { return self::__callStatic('v3_7_2', 0); } + public static function v3_7_3(): self { return self::__callStatic('v3_7_3', 0); } + public static function v3_7_4(): self { return self::__callStatic('v3_7_4', 0); } + public static function v3_7_5(): self { return self::__callStatic('v3_7_5', 0); } + public static function v3_7_6(): self { return self::__callStatic('v3_7_6', 0); } + public static function v3_7_7(): self { return self::__callStatic('v3_7_7', 0); } + public static function v3_7_8(): self { return self::__callStatic('v3_7_8', 0); } + public static function v3_7_9(): self { return self::__callStatic('v3_7_9', 0); } + public static function v3_8(): self { return self::__callStatic('v3_8', 0); } + public static function v3_8_1(): self { return self::__callStatic('v3_8_1', 0); } + public static function v3_8_2(): self { return self::__callStatic('v3_8_2', 0); } + public static function v3_8_3(): self { return self::__callStatic('v3_8_3', 0); } + public static function v3_8_4(): self { return self::__callStatic('v3_8_4', 0); } + public static function v3_8_5(): self { return self::__callStatic('v3_8_5', 0); } + public static function v3_8_6(): self { return self::__callStatic('v3_8_6', 0); } + public static function v3_8_7(): self { return self::__callStatic('v3_8_7', 0); } + public static function v3_8_8(): self { return self::__callStatic('v3_8_8', 0); } + public static function v3_8_9(): self { return self::__callStatic('v3_8_9', 0); } + public static function v3_9(): self { return self::__callStatic('v3_9', 0); } + public static function v3_9_1(): self { return self::__callStatic('v3_9_1', 0); } + public static function v3_9_2(): self { return self::__callStatic('v3_9_2', 0); } + public static function v3_9_3(): self { return self::__callStatic('v3_9_3', 0); } + public static function v3_9_4(): self { return self::__callStatic('v3_9_4', 0); } + public static function v3_9_5(): self { return self::__callStatic('v3_9_5', 0); } + public static function v3_9_6(): self { return self::__callStatic('v3_9_6', 0); } + public static function v3_9_7(): self { return self::__callStatic('v3_9_7', 0); } + public static function v3_9_8(): self { return self::__callStatic('v3_9_8', 0); } + public static function v3_9_9(): self { return self::__callStatic('v3_9_9', 0); } + + public static function v4(): self { return self::__callStatic('v4', 0); } + public static function v4_0(): self { return self::__callStatic('v4_0', 0); } + public static function v4_1(): self { return self::__callStatic('v4_1', 0); } + public static function v4_1_1(): self { return self::__callStatic('v4_1_1', 0); } + public static function v4_1_2(): self { return self::__callStatic('v4_1_2', 0); } + public static function v4_1_3(): self { return self::__callStatic('v4_1_3', 0); } + public static function v4_1_4(): self { return self::__callStatic('v4_1_4', 0); } + public static function v4_1_5(): self { return self::__callStatic('v4_1_5', 0); } + public static function v4_1_6(): self { return self::__callStatic('v4_1_6', 0); } + public static function v4_1_7(): self { return self::__callStatic('v4_1_7', 0); } + public static function v4_1_8(): self { return self::__callStatic('v4_1_8', 0); } + public static function v4_1_9(): self { return self::__callStatic('v4_1_9', 0); } + public static function v4_2(): self { return self::__callStatic('v4_2', 0); } + public static function v4_2_1(): self { return self::__callStatic('v4_2_1', 0); } + public static function v4_2_2(): self { return self::__callStatic('v4_2_2', 0); } + public static function v4_2_3(): self { return self::__callStatic('v4_2_3', 0); } + public static function v4_2_4(): self { return self::__callStatic('v4_2_4', 0); } + public static function v4_2_5(): self { return self::__callStatic('v4_2_5', 0); } + public static function v4_2_6(): self { return self::__callStatic('v4_2_6', 0); } + public static function v4_2_7(): self { return self::__callStatic('v4_2_7', 0); } + public static function v4_2_8(): self { return self::__callStatic('v4_2_8', 0); } + public static function v4_2_9(): self { return self::__callStatic('v4_2_9', 0); } + public static function v4_3(): self { return self::__callStatic('v4_3', 0); } + public static function v4_3_1(): self { return self::__callStatic('v4_3_1', 0); } + public static function v4_3_2(): self { return self::__callStatic('v4_3_2', 0); } + public static function v4_3_3(): self { return self::__callStatic('v4_3_3', 0); } + public static function v4_3_4(): self { return self::__callStatic('v4_3_4', 0); } + public static function v4_3_5(): self { return self::__callStatic('v4_3_5', 0); } + public static function v4_3_6(): self { return self::__callStatic('v4_3_6', 0); } + public static function v4_3_7(): self { return self::__callStatic('v4_3_7', 0); } + public static function v4_3_8(): self { return self::__callStatic('v4_3_8', 0); } + public static function v4_3_9(): self { return self::__callStatic('v4_3_9', 0); } + public static function v4_4(): self { return self::__callStatic('v4_4', 0); } + public static function v4_4_1(): self { return self::__callStatic('v4_4_1', 0); } + public static function v4_4_2(): self { return self::__callStatic('v4_4_2', 0); } + public static function v4_4_3(): self { return self::__callStatic('v4_4_3', 0); } + public static function v4_4_4(): self { return self::__callStatic('v4_4_4', 0); } + public static function v4_4_5(): self { return self::__callStatic('v4_4_5', 0); } + public static function v4_4_6(): self { return self::__callStatic('v4_4_6', 0); } + public static function v4_4_7(): self { return self::__callStatic('v4_4_7', 0); } + public static function v4_4_8(): self { return self::__callStatic('v4_4_8', 0); } + public static function v4_4_9(): self { return self::__callStatic('v4_4_9', 0); } + public static function v4_5(): self { return self::__callStatic('v4_5', 0); } + public static function v4_5_1(): self { return self::__callStatic('v4_5_1', 0); } + public static function v4_5_2(): self { return self::__callStatic('v4_5_2', 0); } + public static function v4_5_3(): self { return self::__callStatic('v4_5_3', 0); } + public static function v4_5_4(): self { return self::__callStatic('v4_5_4', 0); } + public static function v4_5_5(): self { return self::__callStatic('v4_5_5', 0); } + public static function v4_5_6(): self { return self::__callStatic('v4_5_6', 0); } + public static function v4_5_7(): self { return self::__callStatic('v4_5_7', 0); } + public static function v4_5_8(): self { return self::__callStatic('v4_5_8', 0); } + public static function v4_5_9(): self { return self::__callStatic('v4_5_9', 0); } + public static function v4_6(): self { return self::__callStatic('v4_6', 0); } + public static function v4_6_1(): self { return self::__callStatic('v4_6_1', 0); } + public static function v4_6_2(): self { return self::__callStatic('v4_6_2', 0); } + public static function v4_6_3(): self { return self::__callStatic('v4_6_3', 0); } + public static function v4_6_4(): self { return self::__callStatic('v4_6_4', 0); } + public static function v4_6_5(): self { return self::__callStatic('v4_6_5', 0); } + public static function v4_6_6(): self { return self::__callStatic('v4_6_6', 0); } + public static function v4_6_7(): self { return self::__callStatic('v4_6_7', 0); } + public static function v4_6_8(): self { return self::__callStatic('v4_6_8', 0); } + public static function v4_6_9(): self { return self::__callStatic('v4_6_9', 0); } + public static function v4_7(): self { return self::__callStatic('v4_7', 0); } + public static function v4_7_1(): self { return self::__callStatic('v4_7_1', 0); } + public static function v4_7_2(): self { return self::__callStatic('v4_7_2', 0); } + public static function v4_7_3(): self { return self::__callStatic('v4_7_3', 0); } + public static function v4_7_4(): self { return self::__callStatic('v4_7_4', 0); } + public static function v4_7_5(): self { return self::__callStatic('v4_7_5', 0); } + public static function v4_7_6(): self { return self::__callStatic('v4_7_6', 0); } + public static function v4_7_7(): self { return self::__callStatic('v4_7_7', 0); } + public static function v4_7_8(): self { return self::__callStatic('v4_7_8', 0); } + public static function v4_7_9(): self { return self::__callStatic('v4_7_9', 0); } + public static function v4_8(): self { return self::__callStatic('v4_8', 0); } + public static function v4_8_1(): self { return self::__callStatic('v4_8_1', 0); } + public static function v4_8_2(): self { return self::__callStatic('v4_8_2', 0); } + public static function v4_8_3(): self { return self::__callStatic('v4_8_3', 0); } + public static function v4_8_4(): self { return self::__callStatic('v4_8_4', 0); } + public static function v4_8_5(): self { return self::__callStatic('v4_8_5', 0); } + public static function v4_8_6(): self { return self::__callStatic('v4_8_6', 0); } + public static function v4_8_7(): self { return self::__callStatic('v4_8_7', 0); } + public static function v4_8_8(): self { return self::__callStatic('v4_8_8', 0); } + public static function v4_8_9(): self { return self::__callStatic('v4_8_9', 0); } + public static function v4_9(): self { return self::__callStatic('v4_9', 0); } + public static function v4_9_1(): self { return self::__callStatic('v4_9_1', 0); } + public static function v4_9_2(): self { return self::__callStatic('v4_9_2', 0); } + public static function v4_9_3(): self { return self::__callStatic('v4_9_3', 0); } + public static function v4_9_4(): self { return self::__callStatic('v4_9_4', 0); } + public static function v4_9_5(): self { return self::__callStatic('v4_9_5', 0); } + public static function v4_9_6(): self { return self::__callStatic('v4_9_6', 0); } + public static function v4_9_7(): self { return self::__callStatic('v4_9_7', 0); } + public static function v4_9_8(): self { return self::__callStatic('v4_9_8', 0); } + public static function v4_9_9(): self { return self::__callStatic('v4_9_9', 0); } + + public static function v5(): self { return self::__callStatic('v5', 0); } + public static function v5_0(): self { return self::__callStatic('v5_0', 0); } + public static function v5_1(): self { return self::__callStatic('v5_1', 0); } + public static function v5_1_1(): self { return self::__callStatic('v5_1_1', 0); } + public static function v5_1_2(): self { return self::__callStatic('v5_1_2', 0); } + public static function v5_1_3(): self { return self::__callStatic('v5_1_3', 0); } + public static function v5_1_4(): self { return self::__callStatic('v5_1_4', 0); } + public static function v5_1_5(): self { return self::__callStatic('v5_1_5', 0); } + public static function v5_1_6(): self { return self::__callStatic('v5_1_6', 0); } + public static function v5_1_7(): self { return self::__callStatic('v5_1_7', 0); } + public static function v5_1_8(): self { return self::__callStatic('v5_1_8', 0); } + public static function v5_1_9(): self { return self::__callStatic('v5_1_9', 0); } + public static function v5_2(): self { return self::__callStatic('v5_2', 0); } + public static function v5_2_1(): self { return self::__callStatic('v5_2_1', 0); } + public static function v5_2_2(): self { return self::__callStatic('v5_2_2', 0); } + public static function v5_2_3(): self { return self::__callStatic('v5_2_3', 0); } + public static function v5_2_4(): self { return self::__callStatic('v5_2_4', 0); } + public static function v5_2_5(): self { return self::__callStatic('v5_2_5', 0); } + public static function v5_2_6(): self { return self::__callStatic('v5_2_6', 0); } + public static function v5_2_7(): self { return self::__callStatic('v5_2_7', 0); } + public static function v5_2_8(): self { return self::__callStatic('v5_2_8', 0); } + public static function v5_2_9(): self { return self::__callStatic('v5_2_9', 0); } + public static function v5_3(): self { return self::__callStatic('v5_3', 0); } + public static function v5_3_1(): self { return self::__callStatic('v5_3_1', 0); } + public static function v5_3_2(): self { return self::__callStatic('v5_3_2', 0); } + public static function v5_3_3(): self { return self::__callStatic('v5_3_3', 0); } + public static function v5_3_4(): self { return self::__callStatic('v5_3_4', 0); } + public static function v5_3_5(): self { return self::__callStatic('v5_3_5', 0); } + public static function v5_3_6(): self { return self::__callStatic('v5_3_6', 0); } + public static function v5_3_7(): self { return self::__callStatic('v5_3_7', 0); } + public static function v5_3_8(): self { return self::__callStatic('v5_3_8', 0); } + public static function v5_3_9(): self { return self::__callStatic('v5_3_9', 0); } + public static function v5_4(): self { return self::__callStatic('v5_4', 0); } + public static function v5_4_1(): self { return self::__callStatic('v5_4_1', 0); } + public static function v5_4_2(): self { return self::__callStatic('v5_4_2', 0); } + public static function v5_4_3(): self { return self::__callStatic('v5_4_3', 0); } + public static function v5_4_4(): self { return self::__callStatic('v5_4_4', 0); } + public static function v5_4_5(): self { return self::__callStatic('v5_4_5', 0); } + public static function v5_4_6(): self { return self::__callStatic('v5_4_6', 0); } + public static function v5_4_7(): self { return self::__callStatic('v5_4_7', 0); } + public static function v5_4_8(): self { return self::__callStatic('v5_4_8', 0); } + public static function v5_4_9(): self { return self::__callStatic('v5_4_9', 0); } + public static function v5_5(): self { return self::__callStatic('v5_5', 0); } + public static function v5_5_1(): self { return self::__callStatic('v5_5_1', 0); } + public static function v5_5_2(): self { return self::__callStatic('v5_5_2', 0); } + public static function v5_5_3(): self { return self::__callStatic('v5_5_3', 0); } + public static function v5_5_4(): self { return self::__callStatic('v5_5_4', 0); } + public static function v5_5_5(): self { return self::__callStatic('v5_5_5', 0); } + public static function v5_5_6(): self { return self::__callStatic('v5_5_6', 0); } + public static function v5_5_7(): self { return self::__callStatic('v5_5_7', 0); } + public static function v5_5_8(): self { return self::__callStatic('v5_5_8', 0); } + public static function v5_5_9(): self { return self::__callStatic('v5_5_9', 0); } + public static function v5_6(): self { return self::__callStatic('v5_6', 0); } + public static function v5_6_1(): self { return self::__callStatic('v5_6_1', 0); } + public static function v5_6_2(): self { return self::__callStatic('v5_6_2', 0); } + public static function v5_6_3(): self { return self::__callStatic('v5_6_3', 0); } + public static function v5_6_4(): self { return self::__callStatic('v5_6_4', 0); } + public static function v5_6_5(): self { return self::__callStatic('v5_6_5', 0); } + public static function v5_6_6(): self { return self::__callStatic('v5_6_6', 0); } + public static function v5_6_7(): self { return self::__callStatic('v5_6_7', 0); } + public static function v5_6_8(): self { return self::__callStatic('v5_6_8', 0); } + public static function v5_6_9(): self { return self::__callStatic('v5_6_9', 0); } + public static function v5_7(): self { return self::__callStatic('v5_7', 0); } + public static function v5_7_1(): self { return self::__callStatic('v5_7_1', 0); } + public static function v5_7_2(): self { return self::__callStatic('v5_7_2', 0); } + public static function v5_7_3(): self { return self::__callStatic('v5_7_3', 0); } + public static function v5_7_4(): self { return self::__callStatic('v5_7_4', 0); } + public static function v5_7_5(): self { return self::__callStatic('v5_7_5', 0); } + public static function v5_7_6(): self { return self::__callStatic('v5_7_6', 0); } + public static function v5_7_7(): self { return self::__callStatic('v5_7_7', 0); } + public static function v5_7_8(): self { return self::__callStatic('v5_7_8', 0); } + public static function v5_7_9(): self { return self::__callStatic('v5_7_9', 0); } + public static function v5_8(): self { return self::__callStatic('v5_8', 0); } + public static function v5_8_1(): self { return self::__callStatic('v5_8_1', 0); } + public static function v5_8_2(): self { return self::__callStatic('v5_8_2', 0); } + public static function v5_8_3(): self { return self::__callStatic('v5_8_3', 0); } + public static function v5_8_4(): self { return self::__callStatic('v5_8_4', 0); } + public static function v5_8_5(): self { return self::__callStatic('v5_8_5', 0); } + public static function v5_8_6(): self { return self::__callStatic('v5_8_6', 0); } + public static function v5_8_7(): self { return self::__callStatic('v5_8_7', 0); } + public static function v5_8_8(): self { return self::__callStatic('v5_8_8', 0); } + public static function v5_8_9(): self { return self::__callStatic('v5_8_9', 0); } + public static function v5_9(): self { return self::__callStatic('v5_9', 0); } + public static function v5_9_1(): self { return self::__callStatic('v5_9_1', 0); } + public static function v5_9_2(): self { return self::__callStatic('v5_9_2', 0); } + public static function v5_9_3(): self { return self::__callStatic('v5_9_3', 0); } + public static function v5_9_4(): self { return self::__callStatic('v5_9_4', 0); } + public static function v5_9_5(): self { return self::__callStatic('v5_9_5', 0); } + public static function v5_9_6(): self { return self::__callStatic('v5_9_6', 0); } + public static function v5_9_7(): self { return self::__callStatic('v5_9_7', 0); } + public static function v5_9_8(): self { return self::__callStatic('v5_9_8', 0); } + public static function v5_9_9(): self { return self::__callStatic('v5_9_9', 0); } + public static function v6(): self { return self::__callStatic('v6', 0); } + public static function v6_0(): self { return self::__callStatic('v6_0', 0); } + public static function v6_1(): self { return self::__callStatic('v6_1', 0); } + public static function v6_1_1(): self { return self::__callStatic('v6_1_1', 0); } + public static function v6_1_2(): self { return self::__callStatic('v6_1_2', 0); } + public static function v6_1_3(): self { return self::__callStatic('v6_1_3', 0); } + public static function v6_1_4(): self { return self::__callStatic('v6_1_4', 0); } + public static function v6_1_5(): self { return self::__callStatic('v6_1_5', 0); } + public static function v6_1_6(): self { return self::__callStatic('v6_1_6', 0); } + public static function v6_1_7(): self { return self::__callStatic('v6_1_7', 0); } + public static function v6_1_8(): self { return self::__callStatic('v6_1_8', 0); } + public static function v6_1_9(): self { return self::__callStatic('v6_1_9', 0); } + public static function v6_2(): self { return self::__callStatic('v6_2', 0); } + public static function v6_2_1(): self { return self::__callStatic('v6_2_1', 0); } + public static function v6_2_2(): self { return self::__callStatic('v6_2_2', 0); } + public static function v6_2_3(): self { return self::__callStatic('v6_2_3', 0); } + public static function v6_2_4(): self { return self::__callStatic('v6_2_4', 0); } + public static function v6_2_5(): self { return self::__callStatic('v6_2_5', 0); } + public static function v6_2_6(): self { return self::__callStatic('v6_2_6', 0); } + public static function v6_2_7(): self { return self::__callStatic('v6_2_7', 0); } + public static function v6_2_8(): self { return self::__callStatic('v6_2_8', 0); } + public static function v6_2_9(): self { return self::__callStatic('v6_2_9', 0); } + public static function v6_3(): self { return self::__callStatic('v6_3', 0); } + public static function v6_3_1(): self { return self::__callStatic('v6_3_1', 0); } + public static function v6_3_2(): self { return self::__callStatic('v6_3_2', 0); } + public static function v6_3_3(): self { return self::__callStatic('v6_3_3', 0); } + public static function v6_3_4(): self { return self::__callStatic('v6_3_4', 0); } + public static function v6_3_5(): self { return self::__callStatic('v6_3_5', 0); } + public static function v6_3_6(): self { return self::__callStatic('v6_3_6', 0); } + public static function v6_3_7(): self { return self::__callStatic('v6_3_7', 0); } + public static function v6_3_8(): self { return self::__callStatic('v6_3_8', 0); } + public static function v6_3_9(): self { return self::__callStatic('v6_3_9', 0); } + public static function v6_4(): self { return self::__callStatic('v6_4', 0); } + public static function v6_4_1(): self { return self::__callStatic('v6_4_1', 0); } + public static function v6_4_2(): self { return self::__callStatic('v6_4_2', 0); } + public static function v6_4_3(): self { return self::__callStatic('v6_4_3', 0); } + public static function v6_4_4(): self { return self::__callStatic('v6_4_4', 0); } + public static function v6_4_5(): self { return self::__callStatic('v6_4_5', 0); } + public static function v6_4_6(): self { return self::__callStatic('v6_4_6', 0); } + public static function v6_4_7(): self { return self::__callStatic('v6_4_7', 0); } + public static function v6_4_8(): self { return self::__callStatic('v6_4_8', 0); } + public static function v6_4_9(): self { return self::__callStatic('v6_4_9', 0); } + public static function v6_5(): self { return self::__callStatic('v6_5', 0); } + public static function v6_5_1(): self { return self::__callStatic('v6_5_1', 0); } + public static function v6_5_2(): self { return self::__callStatic('v6_5_2', 0); } + public static function v6_5_3(): self { return self::__callStatic('v6_5_3', 0); } + public static function v6_5_4(): self { return self::__callStatic('v6_5_4', 0); } + public static function v6_5_5(): self { return self::__callStatic('v6_5_5', 0); } + public static function v6_5_6(): self { return self::__callStatic('v6_5_6', 0); } + public static function v6_5_7(): self { return self::__callStatic('v6_5_7', 0); } + public static function v6_5_8(): self { return self::__callStatic('v6_5_8', 0); } + public static function v6_5_9(): self { return self::__callStatic('v6_5_9', 0); } + public static function v6_6(): self { return self::__callStatic('v6_6', 0); } + public static function v6_6_1(): self { return self::__callStatic('v6_6_1', 0); } + public static function v6_6_2(): self { return self::__callStatic('v6_6_2', 0); } + public static function v6_6_3(): self { return self::__callStatic('v6_6_3', 0); } + public static function v6_6_4(): self { return self::__callStatic('v6_6_4', 0); } + public static function v6_6_5(): self { return self::__callStatic('v6_6_5', 0); } + public static function v6_6_6(): self { return self::__callStatic('v6_6_6', 0); } + public static function v6_6_7(): self { return self::__callStatic('v6_6_7', 0); } + public static function v6_6_8(): self { return self::__callStatic('v6_6_8', 0); } + public static function v6_6_9(): self { return self::__callStatic('v6_6_9', 0); } + public static function v6_7(): self { return self::__callStatic('v6_7', 0); } + public static function v6_7_1(): self { return self::__callStatic('v6_7_1', 0); } + public static function v6_7_2(): self { return self::__callStatic('v6_7_2', 0); } + public static function v6_7_3(): self { return self::__callStatic('v6_7_3', 0); } + public static function v6_7_4(): self { return self::__callStatic('v6_7_4', 0); } + public static function v6_7_5(): self { return self::__callStatic('v6_7_5', 0); } + public static function v6_7_6(): self { return self::__callStatic('v6_7_6', 0); } + public static function v6_7_7(): self { return self::__callStatic('v6_7_7', 0); } + public static function v6_7_8(): self { return self::__callStatic('v6_7_8', 0); } + public static function v6_7_9(): self { return self::__callStatic('v6_7_9', 0); } + public static function v6_8(): self { return self::__callStatic('v6_8', 0); } + public static function v6_8_1(): self { return self::__callStatic('v6_8_1', 0); } + public static function v6_8_2(): self { return self::__callStatic('v6_8_2', 0); } + public static function v6_8_3(): self { return self::__callStatic('v6_8_3', 0); } + public static function v6_8_4(): self { return self::__callStatic('v6_8_4', 0); } + public static function v6_8_5(): self { return self::__callStatic('v6_8_5', 0); } + public static function v6_8_6(): self { return self::__callStatic('v6_8_6', 0); } + public static function v6_8_7(): self { return self::__callStatic('v6_8_7', 0); } + public static function v6_8_8(): self { return self::__callStatic('v6_8_8', 0); } + public static function v6_8_9(): self { return self::__callStatic('v6_8_9', 0); } + public static function v6_9(): self { return self::__callStatic('v6_9', 0); } + public static function v6_9_1(): self { return self::__callStatic('v6_9_1', 0); } + public static function v6_9_2(): self { return self::__callStatic('v6_9_2', 0); } + public static function v6_9_3(): self { return self::__callStatic('v6_9_3', 0); } + public static function v6_9_4(): self { return self::__callStatic('v6_9_4', 0); } + public static function v6_9_5(): self { return self::__callStatic('v6_9_5', 0); } + public static function v6_9_6(): self { return self::__callStatic('v6_9_6', 0); } + public static function v6_9_7(): self { return self::__callStatic('v6_9_7', 0); } + public static function v6_9_8(): self { return self::__callStatic('v6_9_8', 0); } + public static function v6_9_9(): self { return self::__callStatic('v6_9_9', 0); } + public static function v7(): self { return self::__callStatic('v7', 0); } + public static function v7_0(): self { return self::__callStatic('v7_0', 0); } + public static function v7_0_0(): self { return self::__callStatic('v7_0_0', 0); } } \ No newline at end of file diff --git a/app/controller/api/Controller.php b/app/controller/api/Controller.php index dc91f37..7fb64d7 100644 --- a/app/controller/api/Controller.php +++ b/app/controller/api/Controller.php @@ -4,23 +4,83 @@ namespace PhpSlides\Http; +/** + * Interface ApiController + * + * This interface defines the standard methods for handling HTTP requests + * in a RESTful API. Implementations of this interface should provide + * logic for handling various HTTP methods such as GET, POST, PUT, PATCH, and DELETE. + */ interface ApiController { - // GET + /** + * Handles GET requests to retrieve a list of resources. + * + * @param Request $request The request object containing request parameters. + * @return mixed The response containing the list of resources. + */ public function index(Request $request); - // GET + + /** + * Handles GET requests to retrieve a single resource by ID. + * + * @param Request $request The request object containing request parameters. + * @return mixed The response containing the resource data. + */ public function show(Request $request); - // POST + + /** + * Handles POST requests to create a new resource. + * + * @param Request $request The request object containing the data for the new resource. + * @return mixed The response indicating the result of the creation operation. + */ public function store(Request $request); - // PUT + + /** + * Handles PUT requests to update an existing resource. + * + * @param Request $request The request object containing the updated data for the resource. + * @return mixed The response indicating the result of the update operation. + */ public function update(Request $request); - // PATCH + + /** + * Handles PATCH requests to partially update an existing resource. + * + * @param Request $request The request object containing the partial data for the resource. + * @return mixed The response indicating the result of the partial update operation. + */ public function patch(Request $request); - // DELETE + + /** + * Handles DELETE requests to delete a resource. + * + * @param Request $request The request object containing the identifier of the resource to be deleted. + * @return mixed The response indicating the result of the delete operation. + */ public function destroy(Request $request); + + + /** + * Handles requests that result in an error. + * + * @param Request $request The request object containing request parameters. + * @return mixed The response indicating the error. + */ + public function error(Request $request); + + + /** + * Handles any requests that do not match other methods. + * + * @param Request $request The request object containing request parameters. + * @return mixed The response indicating the default action. + */ + public function __default(Request $request); } diff --git a/app/controller/api/Resources.php b/app/controller/api/Resources.php index e8ef8b5..06790d0 100644 --- a/app/controller/api/Resources.php +++ b/app/controller/api/Resources.php @@ -25,13 +25,13 @@ abstract class ApiResources extends Controller protected static ?array $map = null; - protected function __route (): void + protected function __route(): void { print_r(self::__routeSelection()); exit(); } - protected function __routeSelection (Request $request = null) + protected function __routeSelection(Request $request = null) { $info = self::$map_info; $route = self::$route ?? self::$map; @@ -39,20 +39,18 @@ protected function __routeSelection (Request $request = null) $method = $_SERVER['REQUEST_METHOD']; $controller = $route['controller']; - if (!class_exists($controller)) - { + if (!class_exists($controller)) { http_response_code(405); throw new Exception( - "Api controller class `$controller` does not exist." + "Api controller class `$controller` does not exist." ); } $params = $info['params'] ?? null; - if (!class_exists($controller)) - { + if (!class_exists($controller)) { throw new Exception( - "Api controller class does not exist: `$controller`" + "Api controller class does not exist: `$controller`" ); } $cc = new $controller(); @@ -60,14 +58,12 @@ protected function __routeSelection (Request $request = null) $r_method = ''; $method = strtoupper($_SERVER['REQUEST_METHOD']); - if (isset($route['c_method'])) - { + if (isset($route['c_method'])) { $r_method = $route['c_method']; goto EXECUTE; } - switch ($method) - { + switch ($method) { case 'GET': global $r_method; $r_method = $params !== null ? 'show' : 'index'; @@ -90,12 +86,9 @@ protected function __routeSelection (Request $request = null) break; default: - if (method_exists($cc, '__default')) - { - $r_method = 'default'; - } - else - { + if (method_exists($cc, '__default')) { + $r_method = '__default'; + } else { http_response_code(405); self::log(); exit('Request method not allowed.'); @@ -104,25 +97,25 @@ protected function __routeSelection (Request $request = null) } EXECUTE: - if ($cc instanceof ApiController) - { - if ($request === null) - { + if ($cc instanceof ApiController) { + if ($request === null) { $request = new Request($params); } + $response = $cc->$r_method($request); + $r_method = 'error'; + $response = !$response ? $cc->$r_method($request) : $response; + self::log(); - return $cc->$r_method($request); - } - else - { + return $response; + } else { throw new Exception( - 'Api controller class must implements `ApiController`' + 'Api controller class must implements `ApiController`' ); } } - protected function __middleware (): void + protected function __middleware(): void { $middleware = self::$middleware ?? []; $response = ''; @@ -130,42 +123,33 @@ protected function __middleware (): void $params = self::$map_info['params'] ?? null; $request = new Request($params); - for ($i = 0; $i < count((array) $middleware); $i++) - { + for ($i = 0; $i < count((array) $middleware); $i++) { include_once dirname(__DIR__) . '/../../configs/middlewares.php'; - if (array_key_exists($middleware[$i], $middlewares)) - { + if (array_key_exists($middleware[$i], $middlewares)) { $middleware = $middlewares[$middleware[$i]]; - } - else - { + } else { throw new Exception( - 'No Registered Middleware as `' . $middleware[$i] . '`' + 'No Registered Middleware as `' . $middleware[$i] . '`' ); } - if (!class_exists($middleware)) - { + if (!class_exists($middleware)) { throw new Exception( - "Middleware class does not exist: `{$middleware}`" + "Middleware class does not exist: `{$middleware}`" ); } $mw = new $middleware(); - if ($mw instanceof MiddlewareInterface) - { - $next = function (Request $request) - { + if ($mw instanceof MiddlewareInterface) { + $next = function (Request $request) { return self::__routeSelection($request); }; $response = $mw->handle($request, $next); - } - else - { + } else { throw new Exception( - 'Middleware class must implements `MiddlewareInterface`' + 'Middleware class must implements `MiddlewareInterface`' ); } } @@ -175,9 +159,9 @@ protected function __middleware (): void exit(); } - protected function __map (Request $request = null): void + protected function __map(Request $request = null): void { print_r(self::__routeSelection($request)); exit(); } -} \ No newline at end of file +} diff --git a/app/controller/template/api/ApiController.txt b/app/controller/template/api/ApiController.txt index 86c1065..684d025 100644 --- a/app/controller/template/api/ApiController.txt +++ b/app/controller/template/api/ApiController.txt @@ -25,4 +25,12 @@ final class ControllerName implements ApiController public function destroy(Request $request) { } + + public function error(Request $request) + { + } + + public function __default(Request $request) + { + } } diff --git a/controller/api/ApiExampleController.php b/controller/api/ApiExampleController.php index 5780d47..c328a1c 100644 --- a/controller/api/ApiExampleController.php +++ b/controller/api/ApiExampleController.php @@ -1,7 +1,5 @@ route('/example/user/{id}', ApiExampleController::class) ->middleware(['example']) - ->name('example.user'); \ No newline at end of file + ->name('example.user'); diff --git a/views/components/Header.php b/views/components/Header.php index af2c0e5..018d991 100644 --- a/views/components/Header.php +++ b/views/components/Header.php @@ -11,55 +11,55 @@ \ No newline at end of file From aed49cb9e672f38a845c7ba5ca3db2d2a425fc6f Mon Sep 17 00:00:00 2001 From: dconco Date: Fri, 19 Jul 2024 23:45:16 +0100 Subject: [PATCH 10/11] Added more version methods to API interface manually --- ChangeLog.md | 9 +- .../Http/interface/ApiInterface.php | 563 +++++++++++++++++- 2 files changed, 567 insertions(+), 5 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 8f4d1a6..163a85e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -36,7 +36,8 @@ ## Friday, July 19 2024 -- Make API `define()` method now working with `route()` method. -- Work on `route()` so when using `define()` with `route()` they can pass second parameter in `route()` as controller method for the defined route. -- Added more methods to `Request` class. -- Added documentation to each methods in Request class and interface with Api class and interface. +- Make API `define()` method now working with `route()` method +- Work on `route()` so when using `define()` with `route()` they can pass second parameter in `route()` as controller method for the defined route +- Added more methods to `Request` class +- Added documentation to each methods in Request class and interface with Api class and interface +- Added more version methods manually. diff --git a/app/controller/Http/interface/ApiInterface.php b/app/controller/Http/interface/ApiInterface.php index 4e283a1..9ca037f 100644 --- a/app/controller/Http/interface/ApiInterface.php +++ b/app/controller/Http/interface/ApiInterface.php @@ -67,4 +67,565 @@ public function map(array $rest_url): self; * Automatically handles middleware, route, and map finalization when the object is destroyed. */ public function __destruct(); -} + + + public static function v1(): self; + public static function v1_0(): self; + public static function v1_1(): self; + public static function v1_1_1(): self; + public static function v1_1_2(): self; + public static function v1_1_3(): self; + public static function v1_1_4(): self; + public static function v1_1_5(): self; + public static function v1_1_6(): self; + public static function v1_1_7(): self; + public static function v1_1_8(): self; + public static function v1_1_9(): self; + public static function v1_2(): self; + public static function v1_2_1(): self; + public static function v1_2_2(): self; + public static function v1_2_3(): self; + public static function v1_2_4(): self; + public static function v1_2_5(): self; + public static function v1_2_6(): self; + public static function v1_2_7(): self; + public static function v1_2_8(): self; + public static function v1_2_9(): self; + public static function v1_3(): self; + public static function v1_3_1(): self; + public static function v1_3_2(): self; + public static function v1_3_3(): self; + public static function v1_3_4(): self; + public static function v1_3_5(): self; + public static function v1_3_6(): self; + public static function v1_3_7(): self; + public static function v1_3_8(): self; + public static function v1_3_9(): self; + public static function v1_4(): self; + public static function v1_4_1(): self; + public static function v1_4_2(): self; + public static function v1_4_3(): self; + public static function v1_4_4(): self; + public static function v1_4_5(): self; + public static function v1_4_6(): self; + public static function v1_4_7(): self; + public static function v1_4_8(): self; + public static function v1_4_9(): self; + public static function v1_5(): self; + public static function v1_5_1(): self; + public static function v1_5_2(): self; + public static function v1_5_3(): self; + public static function v1_5_4(): self; + public static function v1_5_5(): self; + public static function v1_5_6(): self; + public static function v1_5_7(): self; + public static function v1_5_8(): self; + public static function v1_5_9(): self; + public static function v1_6(): self; + public static function v1_6_1(): self; + public static function v1_6_2(): self; + public static function v1_6_3(): self; + public static function v1_6_4(): self; + public static function v1_6_5(): self; + public static function v1_6_6(): self; + public static function v1_6_7(): self; + public static function v1_6_8(): self; + public static function v1_6_9(): self; + public static function v1_7(): self; + public static function v1_7_1(): self; + public static function v1_7_2(): self; + public static function v1_7_3(): self; + public static function v1_7_4(): self; + public static function v1_7_5(): self; + public static function v1_7_6(): self; + public static function v1_7_7(): self; + public static function v1_7_8(): self; + public static function v1_7_9(): self; + public static function v1_8(): self; + public static function v1_8_1(): self; + public static function v1_8_2(): self; + public static function v1_8_3(): self; + public static function v1_8_4(): self; + public static function v1_8_5(): self; + public static function v1_8_6(): self; + public static function v1_8_7(): self; + public static function v1_8_8(): self; + public static function v1_8_9(): self; + public static function v1_9(): self; + public static function v1_9_1(): self; + public static function v1_9_2(): self; + public static function v1_9_3(): self; + public static function v1_9_4(): self; + public static function v1_9_5(): self; + public static function v1_9_6(): self; + public static function v1_9_7(): self; + public static function v1_9_8(): self; + public static function v1_9_9(): self; + + public static function v2(): self; + public static function v2_0(): self; + public static function v2_1(): self; + public static function v2_1_1(): self; + public static function v2_1_2(): self; + public static function v2_1_3(): self; + public static function v2_1_4(): self; + public static function v2_1_5(): self; + public static function v2_1_6(): self; + public static function v2_1_7(): self; + public static function v2_1_8(): self; + public static function v2_1_9(): self; + public static function v2_2(): self; + public static function v2_2_1(): self; + public static function v2_2_2(): self; + public static function v2_2_3(): self; + public static function v2_2_4(): self; + public static function v2_2_5(): self; + public static function v2_2_6(): self; + public static function v2_2_7(): self; + public static function v2_2_8(): self; + public static function v2_2_9(): self; + public static function v2_3(): self; + public static function v2_3_1(): self; + public static function v2_3_2(): self; + public static function v2_3_3(): self; + public static function v2_3_4(): self; + public static function v2_3_5(): self; + public static function v2_3_6(): self; + public static function v2_3_7(): self; + public static function v2_3_8(): self; + public static function v2_3_9(): self; + public static function v2_4(): self; + public static function v2_4_1(): self; + public static function v2_4_2(): self; + public static function v2_4_3(): self; + public static function v2_4_4(): self; + public static function v2_4_5(): self; + public static function v2_4_6(): self; + public static function v2_4_7(): self; + public static function v2_4_8(): self; + public static function v2_4_9(): self; + public static function v2_5(): self; + public static function v2_5_1(): self; + public static function v2_5_2(): self; + public static function v2_5_3(): self; + public static function v2_5_4(): self; + public static function v2_5_5(): self; + public static function v2_5_6(): self; + public static function v2_5_7(): self; + public static function v2_5_8(): self; + public static function v2_5_9(): self; + public static function v2_6(): self; + public static function v2_6_1(): self; + public static function v2_6_2(): self; + public static function v2_6_3(): self; + public static function v2_6_4(): self; + public static function v2_6_5(): self; + public static function v2_6_6(): self; + public static function v2_6_7(): self; + public static function v2_6_8(): self; + public static function v2_6_9(): self; + public static function v2_7(): self; + public static function v2_7_1(): self; + public static function v2_7_2(): self; + public static function v2_7_3(): self; + public static function v2_7_4(): self; + public static function v2_7_5(): self; + public static function v2_7_6(): self; + public static function v2_7_7(): self; + public static function v2_7_8(): self; + public static function v2_7_9(): self; + public static function v2_8(): self; + public static function v2_8_1(): self; + public static function v2_8_2(): self; + public static function v2_8_3(): self; + public static function v2_8_4(): self; + public static function v2_8_5(): self; + public static function v2_8_6(): self; + public static function v2_8_7(): self; + public static function v2_8_8(): self; + public static function v2_8_9(): self; + public static function v2_9(): self; + public static function v2_9_1(): self; + public static function v2_9_2(): self; + public static function v2_9_3(): self; + public static function v2_9_4(): self; + public static function v2_9_5(): self; + public static function v2_9_6(): self; + public static function v2_9_7(): self; + public static function v2_9_8(): self; + public static function v2_9_9(): self; + + public static function v3(): self; + public static function v3_0(): self; + public static function v3_1(): self; + public static function v3_1_1(): self; + public static function v3_1_2(): self; + public static function v3_1_3(): self; + public static function v3_1_4(): self; + public static function v3_1_5(): self; + public static function v3_1_6(): self; + public static function v3_1_7(): self; + public static function v3_1_8(): self; + public static function v3_1_9(): self; + public static function v3_2(): self; + public static function v3_2_1(): self; + public static function v3_2_2(): self; + public static function v3_2_3(): self; + public static function v3_2_4(): self; + public static function v3_2_5(): self; + public static function v3_2_6(): self; + public static function v3_2_7(): self; + public static function v3_2_8(): self; + public static function v3_2_9(): self; + public static function v3_3(): self; + public static function v3_3_1(): self; + public static function v3_3_2(): self; + public static function v3_3_3(): self; + public static function v3_3_4(): self; + public static function v3_3_5(): self; + public static function v3_3_6(): self; + public static function v3_3_7(): self; + public static function v3_3_8(): self; + public static function v3_3_9(): self; + public static function v3_4(): self; + public static function v3_4_1(): self; + public static function v3_4_2(): self; + public static function v3_4_3(): self; + public static function v3_4_4(): self; + public static function v3_4_5(): self; + public static function v3_4_6(): self; + public static function v3_4_7(): self; + public static function v3_4_8(): self; + public static function v3_4_9(): self; + public static function v3_5(): self; + public static function v3_5_1(): self; + public static function v3_5_2(): self; + public static function v3_5_3(): self; + public static function v3_5_4(): self; + public static function v3_5_5(): self; + public static function v3_5_6(): self; + public static function v3_5_7(): self; + public static function v3_5_8(): self; + public static function v3_5_9(): self; + public static function v3_6(): self; + public static function v3_6_1(): self; + public static function v3_6_2(): self; + public static function v3_6_3(): self; + public static function v3_6_4(): self; + public static function v3_6_5(): self; + public static function v3_6_6(): self; + public static function v3_6_7(): self; + public static function v3_6_8(): self; + public static function v3_6_9(): self; + public static function v3_7(): self; + public static function v3_7_1(): self; + public static function v3_7_2(): self; + public static function v3_7_3(): self; + public static function v3_7_4(): self; + public static function v3_7_5(): self; + public static function v3_7_6(): self; + public static function v3_7_7(): self; + public static function v3_7_8(): self; + public static function v3_7_9(): self; + public static function v3_8(): self; + public static function v3_8_1(): self; + public static function v3_8_2(): self; + public static function v3_8_3(): self; + public static function v3_8_4(): self; + public static function v3_8_5(): self; + public static function v3_8_6(): self; + public static function v3_8_7(): self; + public static function v3_8_8(): self; + public static function v3_8_9(): self; + public static function v3_9(): self; + public static function v3_9_1(): self; + public static function v3_9_2(): self; + public static function v3_9_3(): self; + public static function v3_9_4(): self; + public static function v3_9_5(): self; + public static function v3_9_6(): self; + public static function v3_9_7(): self; + public static function v3_9_8(): self; + public static function v3_9_9(): self; + + public static function v4(): self; + public static function v4_0(): self; + public static function v4_1(): self; + public static function v4_1_1(): self; + public static function v4_1_2(): self; + public static function v4_1_3(): self; + public static function v4_1_4(): self; + public static function v4_1_5(): self; + public static function v4_1_6(): self; + public static function v4_1_7(): self; + public static function v4_1_8(): self; + public static function v4_1_9(): self; + public static function v4_2(): self; + public static function v4_2_1(): self; + public static function v4_2_2(): self; + public static function v4_2_3(): self; + public static function v4_2_4(): self; + public static function v4_2_5(): self; + public static function v4_2_6(): self; + public static function v4_2_7(): self; + public static function v4_2_8(): self; + public static function v4_2_9(): self; + public static function v4_3(): self; + public static function v4_3_1(): self; + public static function v4_3_2(): self; + public static function v4_3_3(): self; + public static function v4_3_4(): self; + public static function v4_3_5(): self; + public static function v4_3_6(): self; + public static function v4_3_7(): self; + public static function v4_3_8(): self; + public static function v4_3_9(): self; + public static function v4_4(): self; + public static function v4_4_1(): self; + public static function v4_4_2(): self; + public static function v4_4_3(): self; + public static function v4_4_4(): self; + public static function v4_4_5(): self; + public static function v4_4_6(): self; + public static function v4_4_7(): self; + public static function v4_4_8(): self; + public static function v4_4_9(): self; + public static function v4_5(): self; + public static function v4_5_1(): self; + public static function v4_5_2(): self; + public static function v4_5_3(): self; + public static function v4_5_4(): self; + public static function v4_5_5(): self; + public static function v4_5_6(): self; + public static function v4_5_7(): self; + public static function v4_5_8(): self; + public static function v4_5_9(): self; + public static function v4_6(): self; + public static function v4_6_1(): self; + public static function v4_6_2(): self; + public static function v4_6_3(): self; + public static function v4_6_4(): self; + public static function v4_6_5(): self; + public static function v4_6_6(): self; + public static function v4_6_7(): self; + public static function v4_6_8(): self; + public static function v4_6_9(): self; + public static function v4_7(): self; + public static function v4_7_1(): self; + public static function v4_7_2(): self; + public static function v4_7_3(): self; + public static function v4_7_4(): self; + public static function v4_7_5(): self; + public static function v4_7_6(): self; + public static function v4_7_7(): self; + public static function v4_7_8(): self; + public static function v4_7_9(): self; + public static function v4_8(): self; + public static function v4_8_1(): self; + public static function v4_8_2(): self; + public static function v4_8_3(): self; + public static function v4_8_4(): self; + public static function v4_8_5(): self; + public static function v4_8_6(): self; + public static function v4_8_7(): self; + public static function v4_8_8(): self; + public static function v4_8_9(): self; + public static function v4_9(): self; + public static function v4_9_1(): self; + public static function v4_9_2(): self; + public static function v4_9_3(): self; + public static function v4_9_4(): self; + public static function v4_9_5(): self; + public static function v4_9_6(): self; + public static function v4_9_7(): self; + public static function v4_9_8(): self; + public static function v4_9_9(): self; + + public static function v5(): self; + public static function v5_0(): self; + public static function v5_1(): self; + public static function v5_1_1(): self; + public static function v5_1_2(): self; + public static function v5_1_3(): self; + public static function v5_1_4(): self; + public static function v5_1_5(): self; + public static function v5_1_6(): self; + public static function v5_1_7(): self; + public static function v5_1_8(): self; + public static function v5_1_9(): self; + public static function v5_2(): self; + public static function v5_2_1(): self; + public static function v5_2_2(): self; + public static function v5_2_3(): self; + public static function v5_2_4(): self; + public static function v5_2_5(): self; + public static function v5_2_6(): self; + public static function v5_2_7(): self; + public static function v5_2_8(): self; + public static function v5_2_9(): self; + public static function v5_3(): self; + public static function v5_3_1(): self; + public static function v5_3_2(): self; + public static function v5_3_3(): self; + public static function v5_3_4(): self; + public static function v5_3_5(): self; + public static function v5_3_6(): self; + public static function v5_3_7(): self; + public static function v5_3_8(): self; + public static function v5_3_9(): self; + public static function v5_4(): self; + public static function v5_4_1(): self; + public static function v5_4_2(): self; + public static function v5_4_3(): self; + public static function v5_4_4(): self; + public static function v5_4_5(): self; + public static function v5_4_6(): self; + public static function v5_4_7(): self; + public static function v5_4_8(): self; + public static function v5_4_9(): self; + public static function v5_5(): self; + public static function v5_5_1(): self; + public static function v5_5_2(): self; + public static function v5_5_3(): self; + public static function v5_5_4(): self; + public static function v5_5_5(): self; + public static function v5_5_6(): self; + public static function v5_5_7(): self; + public static function v5_5_8(): self; + public static function v5_5_9(): self; + public static function v5_6(): self; + public static function v5_6_1(): self; + public static function v5_6_2(): self; + public static function v5_6_3(): self; + public static function v5_6_4(): self; + public static function v5_6_5(): self; + public static function v5_6_6(): self; + public static function v5_6_7(): self; + public static function v5_6_8(): self; + public static function v5_6_9(): self; + public static function v5_7(): self; + public static function v5_7_1(): self; + public static function v5_7_2(): self; + public static function v5_7_3(): self; + public static function v5_7_4(): self; + public static function v5_7_5(): self; + public static function v5_7_6(): self; + public static function v5_7_7(): self; + public static function v5_7_8(): self; + public static function v5_7_9(): self; + public static function v5_8(): self; + public static function v5_8_1(): self; + public static function v5_8_2(): self; + public static function v5_8_3(): self; + public static function v5_8_4(): self; + public static function v5_8_5(): self; + public static function v5_8_6(): self; + public static function v5_8_7(): self; + public static function v5_8_8(): self; + public static function v5_8_9(): self; + public static function v5_9(): self; + public static function v5_9_1(): self; + public static function v5_9_2(): self; + public static function v5_9_3(): self; + public static function v5_9_4(): self; + public static function v5_9_5(): self; + public static function v5_9_6(): self; + public static function v5_9_7(): self; + public static function v5_9_8(): self; + public static function v5_9_9(): self; + public static function v6(): self; + public static function v6_0(): self; + public static function v6_1(): self; + public static function v6_1_1(): self; + public static function v6_1_2(): self; + public static function v6_1_3(): self; + public static function v6_1_4(): self; + public static function v6_1_5(): self; + public static function v6_1_6(): self; + public static function v6_1_7(): self; + public static function v6_1_8(): self; + public static function v6_1_9(): self; + public static function v6_2(): self; + public static function v6_2_1(): self; + public static function v6_2_2(): self; + public static function v6_2_3(): self; + public static function v6_2_4(): self; + public static function v6_2_5(): self; + public static function v6_2_6(): self; + public static function v6_2_7(): self; + public static function v6_2_8(): self; + public static function v6_2_9(): self; + public static function v6_3(): self; + public static function v6_3_1(): self; + public static function v6_3_2(): self; + public static function v6_3_3(): self; + public static function v6_3_4(): self; + public static function v6_3_5(): self; + public static function v6_3_6(): self; + public static function v6_3_7(): self; + public static function v6_3_8(): self; + public static function v6_3_9(): self; + public static function v6_4(): self; + public static function v6_4_1(): self; + public static function v6_4_2(): self; + public static function v6_4_3(): self; + public static function v6_4_4(): self; + public static function v6_4_5(): self; + public static function v6_4_6(): self; + public static function v6_4_7(): self; + public static function v6_4_8(): self; + public static function v6_4_9(): self; + public static function v6_5(): self; + public static function v6_5_1(): self; + public static function v6_5_2(): self; + public static function v6_5_3(): self; + public static function v6_5_4(): self; + public static function v6_5_5(): self; + public static function v6_5_6(): self; + public static function v6_5_7(): self; + public static function v6_5_8(): self; + public static function v6_5_9(): self; + public static function v6_6(): self; + public static function v6_6_1(): self; + public static function v6_6_2(): self; + public static function v6_6_3(): self; + public static function v6_6_4(): self; + public static function v6_6_5(): self; + public static function v6_6_6(): self; + public static function v6_6_7(): self; + public static function v6_6_8(): self; + public static function v6_6_9(): self; + public static function v6_7(): self; + public static function v6_7_1(): self; + public static function v6_7_2(): self; + public static function v6_7_3(): self; + public static function v6_7_4(): self; + public static function v6_7_5(): self; + public static function v6_7_6(): self; + public static function v6_7_7(): self; + public static function v6_7_8(): self; + public static function v6_7_9(): self; + public static function v6_8(): self; + public static function v6_8_1(): self; + public static function v6_8_2(): self; + public static function v6_8_3(): self; + public static function v6_8_4(): self; + public static function v6_8_5(): self; + public static function v6_8_6(): self; + public static function v6_8_7(): self; + public static function v6_8_8(): self; + public static function v6_8_9(): self; + public static function v6_9(): self; + public static function v6_9_1(): self; + public static function v6_9_2(): self; + public static function v6_9_3(): self; + public static function v6_9_4(): self; + public static function v6_9_5(): self; + public static function v6_9_6(): self; + public static function v6_9_7(): self; + public static function v6_9_8(): self; + public static function v6_9_9(): self; + public static function v7(): self; + public static function v7_0(): self; + public static function v7_0_0(): self; +} \ No newline at end of file From 90a9f46abcf5f54c784581869b5faee25c887dee Mon Sep 17 00:00:00 2001 From: dconco Date: Fri, 19 Jul 2024 23:46:15 +0100 Subject: [PATCH 11/11] Added more version methods to API interface manually --- ChangeLog.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 163a85e..59e43a5 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -40,4 +40,5 @@ - Work on `route()` so when using `define()` with `route()` they can pass second parameter in `route()` as controller method for the defined route - Added more methods to `Request` class - Added documentation to each methods in Request class and interface with Api class and interface -- Added more version methods manually. +- Added more version methods API class manually. +- Added more version methods to API interface manually.