diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/mirzaev/minimal/system/controller.php b/mirzaev/minimal/system/controller.php index 93fc563..b08a0c2 100755 --- a/mirzaev/minimal/system/controller.php +++ b/mirzaev/minimal/system/controller.php @@ -11,12 +11,15 @@ use mirzaev\minimal\model, mirzaev\minimal\http\request, mirzaev\minimal\http\enumerations\status; -// Build-in libraries -use exception; +// Built-in libraries +use exception, + RuntimeException as exception_runtime; /** * Controller * + * @package mirzaev\minimal + * * @var core $core An instance of the core * @var request $request Request * @var model $model An instance of the model connected in the core @@ -24,8 +27,6 @@ use exception; * * @method void __construct(core $core) Constructor * - * @package mirzaev\minimal - * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich */ @@ -56,12 +57,32 @@ class controller /** * Model * + * @throws exception_runtime if reinitialize the property + * @throws exception_runtime if an attempt to write null + * * @var model $model An instance of the model connected in the core */ - public model $model { + public ?model $model = null { // Write - set (model $model) { - $this->model ??= $model; + set (model|null $model) { + if (isset($this->{__PROPERTY__})) { + // The property is already initialized + + // Exit (fail) + throw new exception_runtime('The property is already initialized: ' . __PROPERTY__, status::internal_server_error->value); + } + + if ($model instanceof model) { + // Validated model + + // Writing + $this->model = $model; + } else { + // Not validated model + + // Exit (fail) + throw new exception_runtime('The property must be an instance of model', status::internal_server_error->value); + } } // Read diff --git a/mirzaev/minimal/system/core.php b/mirzaev/minimal/system/core.php index 0349479..3776aea 100755 --- a/mirzaev/minimal/system/core.php +++ b/mirzaev/minimal/system/core.php @@ -15,6 +15,7 @@ use mirzaev\minimal\router, // Built-in libraries use exception, + RuntimeException as exception_runtime, BadMethodCallException as exception_method, DomainException as exception_domain, InvalidArgumentException as exception_argument, @@ -25,6 +26,8 @@ use exception, /** * Core * + * @package mirzaev\minimal + * * @param string $namespace Namespace where the core was initialized from * @param controller $controller An instance of the controller * @param model $model An instance of the model @@ -36,8 +39,6 @@ use exception, * @method string|null request(request $request, array $parameters = []) Handle request * @method string|null route(route $route, string $method) Handle route * - * @package mirzaev\minimal - * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich */ @@ -193,6 +194,9 @@ final class core // Deinitializing name of the controller class unset($controller); + if (!isset($route->controller->model)) { + // + // Initializing name if the model class $model = $route->model; @@ -219,6 +223,7 @@ final class core // Writing the model to the controller $route->controller->model = $route->model; } +} // Writing the request to the controller $route->controller->request = $request; @@ -226,8 +231,16 @@ final class core if (method_exists($route->controller, $route->method)) { // Found the method of the controller - // Executing method of the controller and exit (success) - return $route->controller->{$route->method}(...($route->parameters + $request->parameters)); + try { + // Executing method of the controller and exit (success) + return $route->controller->{$route->method}(...($route->parameters + $request->parameters)); + } catch (exception $e) { + // Catched an exception + + // Exit (fail) + throw new exception_runtime(...$e); + } + } else { // Not found the method of the controller diff --git a/mirzaev/minimal/system/http/enumerations/content.php b/mirzaev/minimal/system/http/enumerations/content.php old mode 100644 new mode 100755 index f67585c..f9cce57 --- a/mirzaev/minimal/system/http/enumerations/content.php +++ b/mirzaev/minimal/system/http/enumerations/content.php @@ -4,6 +4,13 @@ declare(strict_types=1); namespace mirzaev\minimal\http\enumerations; +// Files of the project +use mirzaev\minimal\http\enumerations\status; + +// Built-in libraries +use InvalidArgumentException as exception_argument, + DomainException as exception_domain; + /** * Content * @@ -18,7 +25,7 @@ enum content: string { case any = '*/*'; - // Text + // Text case txt = 'text/plain'; case css = 'text/css'; @@ -26,7 +33,7 @@ enum content: string case html = 'text/html'; case js = 'text/javascript'; // js + mjs (https://www.rfc-editor.org/rfc/rfc9239#name-text-javascript) - // Applications + // Applications case binary = 'application/octet-stream'; case encoded = 'application/x-www-form-urlencoded'; @@ -49,7 +56,7 @@ enum content: string case sh = 'application/x-sh'; case xhtml = 'application/xhtml+xml'; - // Audio + // Audio case aac = 'audio/aac'; case mp3 = 'audio/mpeg'; @@ -57,8 +64,8 @@ enum content: string case oga = 'audio/ogg'; case weba = 'audio/webm'; - // Images - + // Images + case gif = 'image/gif'; case jpeg = 'image/jpeg'; case png = 'image/png'; @@ -70,25 +77,46 @@ enum content: string case bmp = 'image/bmp'; case ico = 'image/vnd.microsoft.icon'; - // Videos - + // Videos + case avi = 'video/x-msvideo'; case mp4 = 'video/mp4'; case mpeg = 'video/mpeg'; case ogv = 'video/ogg'; case ts = 'video/mp2t'; - // Fonts - + // Fonts + case otf = 'font/otf'; case ttf = 'font/ttf'; case woff = 'font/woff'; case woff2 = 'font/woff2'; - // Multipart - + // Multipart + case form = 'multipart/form-data'; case mixed = 'multipart/mixed'; case alternative = 'multipart/alternative'; case related = 'multipart/related'; + + /** + * Extension + * + * Returns the file extension without a dot + * + * @throws exception_argument if content can not have file extension + * @throws exception_domain if failed to recognize content + * + * @return string File extension + */ + public function extension(): string + { + // Exit (success) + return match ($this) { + self::jpeg => 'jpg', + self::png => 'png', + self::form, self::mixed, self::alternative, self::related => throw new exception_argument('Content can not have file extension', status::internal_server_error->value), + default => throw new exception_domain('Failed to recognize content: ' . $this->value, status::not_found->value) + }; + } } diff --git a/mirzaev/minimal/system/http/enumerations/method.php b/mirzaev/minimal/system/http/enumerations/method.php old mode 100644 new mode 100755 diff --git a/mirzaev/minimal/system/http/enumerations/protocol.php b/mirzaev/minimal/system/http/enumerations/protocol.php old mode 100644 new mode 100755 index 29912d8..dc9b784 --- a/mirzaev/minimal/system/http/enumerations/protocol.php +++ b/mirzaev/minimal/system/http/enumerations/protocol.php @@ -16,9 +16,9 @@ namespace mirzaev\minimal\http\enumerations; */ enum protocol: string { - case HTTP_3 = 'HTTP/3'; - case HTTP_2 = 'HTTP/2'; - case HTTP_1_1 = 'HTTP/1.1'; - case HTTP_1_0 = 'hTTP/1.0'; - case HTTP_0_9 = 'HTTP/0.9'; + case http_3 = 'HTTP/3'; + case http_2 = 'HTTP/2'; + case http_1_1 = 'HTTP/1.1'; + case http_1 = 'hTTP/1.0'; + case http_0_9 = 'HTTP/0.9'; } diff --git a/mirzaev/minimal/system/http/enumerations/status.php b/mirzaev/minimal/system/http/enumerations/status.php old mode 100644 new mode 100755 diff --git a/mirzaev/minimal/system/http/request.php b/mirzaev/minimal/system/http/request.php index 02b5c14..ba6d466 100755 --- a/mirzaev/minimal/system/http/request.php +++ b/mirzaev/minimal/system/http/request.php @@ -20,6 +20,8 @@ use DomainException as exception_domain, /** * Request * + * @package mirzaev\minimal\http + * * @param method $method Method * @param string $uri URI * @param protocol $protocol Version of HTTP protocol @@ -32,8 +34,6 @@ use DomainException as exception_domain, * @method response response() Generate response for request * @method self header(string $name, string $value) Write a header to the headers property * - * @package mirzaev\minimal\http - * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich */ diff --git a/mirzaev/minimal/system/http/response.php b/mirzaev/minimal/system/http/response.php index c1ae4b7..3f6f31b 100755 --- a/mirzaev/minimal/system/http/response.php +++ b/mirzaev/minimal/system/http/response.php @@ -20,6 +20,8 @@ use DomainException as exception_domain, /** * Response * + * @package mirzaev\minimal\http + * * @param protocol $protocol Version of HTTP protocol * @param status $status Status * @param array $headers Headers @@ -37,8 +39,6 @@ use DomainException as exception_domain, * @method self clean() Delete everything in the output buffer * @method self end() Initializes response headers and flushes the output buffer * - * @package mirzaev\minimal\http - * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich */ @@ -49,7 +49,6 @@ final class response * * @see https://wiki.php.net/rfc/property-hooks (find a table about backed and virtual hooks) * - * @throws exception_runtime if reinitialize the property * @throws exception_domain if failed to recognize HTTP version * * @var protocol $protocol Version of HTTP protocol @@ -57,12 +56,6 @@ final class response public protocol $protocol { // Write set (protocol|string $value) { - if (isset($this->{__PROPERTY__})) { - // The property is already initialized - - // Exit (fail) - throw new exception_runtime('The property is already initialized: ' . __PROPERTY__, status::internal_server_error->value); - } if ($value instanceof protocol) { // Received implementation of HTTP version @@ -95,7 +88,6 @@ final class response * * @see https://wiki.php.net/rfc/property-hooks (find a table about backed and virtual hooks) * - * @throws exception_runtime if reinitialize the property * @throws exception_domain if failed to recognize status * * @var status $status Status @@ -103,12 +95,6 @@ final class response public status $status { // Write set (status|string $value) { - if (isset($this->{__PROPERTY__})) { - // The property is already initialized - - // Exit (fail) - throw new exception_runtime('The property is already initialized: ' . __PROPERTY__, status::internal_server_error->value); - } if ($value instanceof status) { // Received implementation of status @@ -161,10 +147,10 @@ final class response set (string $value) { // Writing $this->body = $value; - }; + } // Read - &get => $this->body; + get => $this->body; } /** @@ -353,12 +339,42 @@ final class response * * Generates the status line (HTTP/2 200 OK) * + * @param protocol|null $protocol Version of HTTP + * @param status|null $status Status code and status text + * * @return string The status line */ - public function status(): string + public function status(?protocol $protocol = null, ?status $status = null): string { + // Declaring buffer of status line + $buffer = ''; + + if ($protocol instanceof protocol) { + // Received version of HTTP + + // Writing to buffer of status line + $buffer .= $protocol->value . ' '; + } else { + // Not received version of HTTP + + // Writing to buffer of status line + $buffer .= $this->protocol->value . ' '; + } + + if ($status instanceof status) { + // Received status + + // Writing to buffer of status line + $buffer .= $status->value . ' ' . $status->label(); + } else { + // Not received status + + // Writing to buffer of status line + $buffer .= $this->status->value . ' ' . $this->status->label(); + } + // Exit (success) - return $this->protocol->value . ' ' . $this->status->value . ' ' . $this->status->label(); + return $buffer; } /** diff --git a/mirzaev/minimal/system/model.php b/mirzaev/minimal/system/model.php index 2a39b95..02a92fc 100755 --- a/mirzaev/minimal/system/model.php +++ b/mirzaev/minimal/system/model.php @@ -10,10 +10,10 @@ use mirzaev\minimal\traits\magic; /** * Model * - * @method void __construct() Constructor - * * @package mirzaev\minimal * + * @method void __construct() Constructor + * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich */ diff --git a/mirzaev/minimal/system/route.php b/mirzaev/minimal/system/route.php index d88aad9..8a556da 100755 --- a/mirzaev/minimal/system/route.php +++ b/mirzaev/minimal/system/route.php @@ -7,6 +7,8 @@ namespace mirzaev\minimal; /** * Route * + * @package mirzaev\minimal + * * @param string|controller $controller Name of the controller * @param string $method Name of the method of the method of $this->controller * @param string|model $model Name of the model @@ -15,8 +17,6 @@ namespace mirzaev\minimal; * * @method void __construct(string|controller $controller, ?string $method, string|model|null $model, array $parameters, array $options) Constructor * - * @package mirzaev\minimal - * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich */ diff --git a/mirzaev/minimal/system/router.php b/mirzaev/minimal/system/router.php index 85755db..b28ade4 100755 --- a/mirzaev/minimal/system/router.php +++ b/mirzaev/minimal/system/router.php @@ -15,6 +15,8 @@ use InvalidArgumentException as exception_argument; /** * Router * + * @package mirzaev\minimal + * * @param array $routes Registry of routes * * @method self write(string $urn, route $route, string|array $method) Write route to registry of routes (fluent interface) @@ -22,8 +24,6 @@ use InvalidArgumentException as exception_argument; * @method self sort() Sort routes (DEV) * @method string universalize(string $urn) Universalize URN * - * @package mirzaev\minimal - * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich */ diff --git a/mirzaev/minimal/system/traits/magic.php b/mirzaev/minimal/system/traits/magic.php index 6b29e40..0defbbf 100755 --- a/mirzaev/minimal/system/traits/magic.php +++ b/mirzaev/minimal/system/traits/magic.php @@ -13,13 +13,13 @@ use exception; /** * Trait of magical methods * + * @package mirzaev\minimal\traits + * * @method void __set(string $name, mixed $value) Write property * @method mixed __get(string $name) Read property * @method void __unset(string $name) Delete property * @method bool __isset(string $name) Check property for initialization * - * @package mirzaev\minimal\traits - * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich */ diff --git a/mirzaev/minimal/system/traits/singleton.php b/mirzaev/minimal/system/traits/singleton.php old mode 100644 new mode 100755 index cf25e17..1ea7a12 --- a/mirzaev/minimal/system/traits/singleton.php +++ b/mirzaev/minimal/system/traits/singleton.php @@ -10,10 +10,10 @@ use exception; /** * Trait of singleton * - * @method static initialize() Initialize an instance - * * @package mirzaev\minimal\traits * + * @method static initialize() Initialize an instance + * * @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License * @author Arsen Mirzaev Tatyano-Muradovich */