diff --git a/ChangeLog.md b/ChangeLog.md index eb5fcd7..59e43a5 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -2,28 +2,43 @@ ## 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. + +## 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 +- Added more version methods API class manually. +- Added more version methods to API interface manually. diff --git a/app/PhpSlides.php b/app/PhpSlides.php index 3674ad4..adc3207 100644 --- a/app/PhpSlides.php +++ b/app/PhpSlides.php @@ -17,11 +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; /** * ------------------------------------------------------------------------------- @@ -42,7 +41,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 +62,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 +632,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 +648,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 +664,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 +677,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 +703,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,15 +847,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 () { if (self::$middleware !== null) @@ -1189,4 +941,4 @@ final public static function render (string $view): mixed exit($e->getMessage()); } } -} +} \ No newline at end of file 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 aca1584..9ca037f 100644 --- a/app/controller/Http/interface/ApiInterface.php +++ b/app/controller/Http/interface/ApiInterface.php @@ -4,11 +4,628 @@ 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 route (string $url, string $controller): self; - public function middleware (array $middleware): 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 __destruct (); + + /** + * 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; + + + /** + * 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(); + + + 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 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 ac1bd1c..5392e76 100644 --- a/app/controller/api/Api.php +++ b/app/controller/api/Api.php @@ -6,28 +6,43 @@ use Exception; use PhpSlides\Route\MapRoute; -use PhpSlides\Controller\Controller; use PhpSlides\Interface\ApiInterface; -use PhpSlides\Interface\MiddlewareInterface; - -final class Api extends Controller implements ApiInterface +use PhpSlides\Http\Resources\ApiResources; + +/** + * 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 { + /** + * 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'; - 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; + /** + * 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 { if (str_starts_with($method, 'v')) { @@ -40,16 +55,42 @@ 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 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; } + + /** + * 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, '/') ); @@ -64,92 +105,22 @@ public function route(string $url, string $controller): self self::$route = [ 'url' => $uri, - 'controller' => $controller + 'controller' => $define['controller'] ?? $controller ]; - } + if ($define !== null && !empty($controller)) + self::$route['c_method'] = trim($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`' - ); - } - } + /** + * 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) { @@ -159,50 +130,14 @@ public function middleware(array $middleware): self 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(); - } + /** + * 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 = [ @@ -213,7 +148,14 @@ public function define(string $url, string $controller): self return $this; } - private function map(array $rest_url): void + + /** + * 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; @@ -221,32 +163,48 @@ private function map(array $rest_url): void $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 = [ + 'url' => $uri, + 'c_method' => ltrim($c_method[1], '@'), + 'controller' => $controller + ]; + + break; + } + } - if (self::$map_info) { - self::$map_info['method'] = $_SERVER['REQUEST_METHOD']; + self::$regRoute[] = $regUrl; - self::$route = [ - 'url' => $uri, - 'controller' => $controller - ]; + if (!in_array($_SERVER['REQUEST_METHOD'], $method)) { + http_response_code(405); + self::log(); + exit('Method Not Allowed'); } } + return $this; } + + /** + * Automatically handles middleware, route, and map finalization when the object is destroyed. + */ public function __destruct() { if (self::$middleware !== null) { @@ -256,5 +214,580 @@ public function __destruct() if (self::$route !== null) { self::__route(); } + + 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 new file mode 100644 index 0000000..06790d0 --- /dev/null +++ b/app/controller/api/Resources.php @@ -0,0 +1,167 @@ +$r_method($request); + $r_method = 'error'; + $response = !$response ? $cc->$r_method($request) : $response; + + self::log(); + return $response; + } 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(); + } +} 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/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 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 @@ 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 diff --git a/controller/api/ApiExampleController.php b/controller/api/ApiExampleController.php index b7a07d1..c328a1c 100644 --- a/controller/api/ApiExampleController.php +++ b/controller/api/ApiExampleController.php @@ -1,40 +1,41 @@ -urlParam()->id; - $route = route('example.user', [ $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) - { - } -} +route('/example/user/{id}', ApiExampleController::class) - ->middleware(['example'])->name('example.user');*/ - -Api::v1() - ->define('/example/user', ApiExampleController::class) - ->map([ - '/' => '@index', - '/{id}' => '@show', - '/delete/{id}' => '@destroy' - ])->name('example.user'); + ->middleware(['example']) + ->name('example.user'); 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')); 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