From 67221e0d933df532239d4bc67feee79ad7539ec5 Mon Sep 17 00:00:00 2001 From: User Date: Mon, 29 May 2023 03:04:33 +0300 Subject: [PATCH] Init --- .env.dist | 31 ++++++ .gitignore | 6 ++ README.md | 2 + composer.json | 35 +++++++ config/appnodes.php | 17 ++++ config/components.php | 21 +++++ config/container/services.php | 11 +++ config/container/settings.php | 5 + config/factories/containerFactory.php | 18 ++++ config/factories/loggerFactory.php | 2 + config/factories/routerFactory.php | 2 + config/factories/templateFactory.php | 2 + config/routes/main.json | 14 +++ config/routes/main.yaml | 12 +++ config/routes/main/09-main.yaml | 13 +++ config/routes/main/collection.php | 9 ++ public/index.php | 40 ++++++++ public/web/404.html | 10 ++ public/web/500.html | 10 ++ public/web/main/css/style.css | 18 ++++ public/web/main/images/.gitkeep | 0 public/web/main/js/script.js | 0 public/web/main/sheet.html | 19 ++++ public/web/source/.gitkeep | 0 src/Common/Components/.gitkeep | 0 src/Common/Controllers/AbstractController.php | 94 +++++++++++++++++++ .../Controllers/AbstractPageController.php | 38 ++++++++ src/Common/Controllers/NotFoundException.php | 7 ++ src/Common/Domain/.gitkeep | 0 src/Common/Repository/RepositoryException.php | 15 +++ src/Common/Services/AbstractService.php | 10 ++ src/Common/Services/ServiceException.php | 16 ++++ src/Main/Components/.gitkeep | 0 src/Main/Controllers/IndexController.php | 25 +++++ src/Main/Domain/.gitkeep | 0 src/Main/Repository/DTO/.gitkeep | 0 src/Main/Repository/Interface/.gitkeep | 0 src/Main/Repository/Mysql/.gitkeep | 0 src/Main/Services/.gitkeep | 0 templates/main/errpage.tpl | 9 ++ templates/main/index.tpl | 5 + 41 files changed, 516 insertions(+) create mode 100644 .env.dist create mode 100644 .gitignore create mode 100644 README.md create mode 100644 composer.json create mode 100644 config/appnodes.php create mode 100644 config/components.php create mode 100644 config/container/services.php create mode 100644 config/container/settings.php create mode 100644 config/factories/containerFactory.php create mode 100644 config/factories/loggerFactory.php create mode 100644 config/factories/routerFactory.php create mode 100644 config/factories/templateFactory.php create mode 100644 config/routes/main.json create mode 100644 config/routes/main.yaml create mode 100644 config/routes/main/09-main.yaml create mode 100644 config/routes/main/collection.php create mode 100644 public/index.php create mode 100644 public/web/404.html create mode 100644 public/web/500.html create mode 100644 public/web/main/css/style.css create mode 100644 public/web/main/images/.gitkeep create mode 100644 public/web/main/js/script.js create mode 100644 public/web/main/sheet.html create mode 100644 public/web/source/.gitkeep create mode 100644 src/Common/Components/.gitkeep create mode 100644 src/Common/Controllers/AbstractController.php create mode 100644 src/Common/Controllers/AbstractPageController.php create mode 100644 src/Common/Controllers/NotFoundException.php create mode 100644 src/Common/Domain/.gitkeep create mode 100644 src/Common/Repository/RepositoryException.php create mode 100644 src/Common/Services/AbstractService.php create mode 100644 src/Common/Services/ServiceException.php create mode 100644 src/Main/Components/.gitkeep create mode 100644 src/Main/Controllers/IndexController.php create mode 100644 src/Main/Domain/.gitkeep create mode 100644 src/Main/Repository/DTO/.gitkeep create mode 100644 src/Main/Repository/Interface/.gitkeep create mode 100644 src/Main/Repository/Mysql/.gitkeep create mode 100644 src/Main/Services/.gitkeep create mode 100644 templates/main/errpage.tpl create mode 100644 templates/main/index.tpl diff --git a/.env.dist b/.env.dist new file mode 100644 index 0000000..33584f1 --- /dev/null +++ b/.env.dist @@ -0,0 +1,31 @@ +# In all environments, the following files are loaded if they exist, +# the latter taking precedence over the former: +# +# * .env contains default values for the environment variables needed by the app +# * .env.local uncommitted file with local overrides +# * .env.$APP_ENV committed environment-specific defaults +# * .env.$APP_ENV.local uncommitted environment-specific overrides +# +# Real environment variables win over .env files. + +# App mode (DEV, TEST, PROD) +APP_MODE=DEV + +# Including file with array of componens +APP_COMPONENTS_FILE="config/components.php" + +# Including file with array of app nodes +APP_NODES_FILE="config/appnodes.php" + +# Define app nodes +#APP_NODE1='{"key":"/","action":"App\\Auth\\Controllers\\UserController","method":"index"}' +#APP_NODE2='{"key":"/","router":"config/routes/main/collection.php"}' + +# Default page +PAGE404="public/web/404.html" +PAGE501="public/web/501.html" + +# Users environment + +CONTAINER_DIR="config/container" +MYSQL_PARAM='{"host":"host.docker.internal", "user":"***user***", "pass":"***password***","base":"***basename***", "logsEnable":true}' \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3a57cef --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.idea/ +/vendor +/var +composer.lock +.env +.env.local \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..2ad5b8b --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +## Rmphp/Skeleton + diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..6cc0e32 --- /dev/null +++ b/composer.json @@ -0,0 +1,35 @@ +{ + "name": "rmphp/skeleton", + "type": "project", + "license": "proprietary", + "minimum-stability": "dev", + "prefer-stable" : true, + "require": { + "php": "^8.1", + "ext-json": "*", + "ext-yaml": "*", + "laminas/laminas-diactoros": "^2.5", + "monolog/monolog": "^2.3", + "php-di/php-di": "^6.3", + "symfony/dotenv": "^6.2", + "rmphp/kernel": "1.0.x-dev", + "rmphp/router": "1.0.x-dev", + "rmphp/content": "1.0.x-dev", + "rmphp/storage": "1.0.x-dev" + }, + "autoload": { + "psr-4": { + "App\\": "src" + } + }, + "scripts": { + "start": "php -S localhost:8080 -t public" + }, + "config": { + "sort-packages": true, + "process-timeout":0 + }, + "require-dev": { + + } +} diff --git a/config/appnodes.php b/config/appnodes.php new file mode 100644 index 0000000..cb8e654 --- /dev/null +++ b/config/appnodes.php @@ -0,0 +1,17 @@ +'/', "action"=>"App\\Main\\Controllers\\IndexController", "method"=>"index"], +# ['key'=>'/', 'router'=>'config/routes/main/collection.php'], +# ['key'=>'/', 'router'=>'config/routes/main.json'] +# ['key'=>'/', 'router'=>'config/routes/main.yaml'], + +return [ + ['key'=>'/', 'router'=>'config/routes/main.yaml'], +]; + \ No newline at end of file diff --git a/config/components.php b/config/components.php new file mode 100644 index 0000000..bcdf9df --- /dev/null +++ b/config/components.php @@ -0,0 +1,21 @@ + 'config/factories/routerFactory.php', + /** + * Путь к файлу фабрики возвращающий реализацию TemplateInterface или сам экземпляр класса + */ + \Rmphp\Foundation\TemplateInterface::class => 'config/factories/templateFactory.php', + /** + * Путь к файлу фабрики возвращающий реализацию PSR-3 LoggerInterface или сам экземпляр класса + */ + \Psr\Log\LoggerInterface::class => 'config/factories/loggerFactory.php', + /** + * Путь к файлу фабрики возвращающий реализацию PSR-11 ContainerInterface или сам экземпляр класса + */ + \Psr\Container\ContainerInterface::class => 'config/factories/containerFactory.php', +]; + \ No newline at end of file diff --git a/config/container/services.php b/config/container/services.php new file mode 100644 index 0000000..475521e --- /dev/null +++ b/config/container/services.php @@ -0,0 +1,11 @@ + DI\create(MysqlStorage::class)->constructor(json_decode(getenv("MYSQL_PARAM"), true)), + 'App\*\Domain\Repository\*RepositoryInterface' => DI\autowire('App\*\Repository\Mysql\*Repository'), + 'App\*\Services\*\*Service' => DI\autowire('App\*\Services\*\*Service'), + 'App\*\Services\*Service' => DI\autowire('App\*\Services\*Service'), +]; \ No newline at end of file diff --git a/config/container/settings.php b/config/container/settings.php new file mode 100644 index 0000000..efc2d96 --- /dev/null +++ b/config/container/settings.php @@ -0,0 +1,5 @@ +value +]; \ No newline at end of file diff --git a/config/factories/containerFactory.php b/config/factories/containerFactory.php new file mode 100644 index 0000000..9fcfc3e --- /dev/null +++ b/config/factories/containerFactory.php @@ -0,0 +1,18 @@ +enableCompilation(__DIR__ . '/../../var/cache/container'); + $builder->addDefinitions(array_replace_recursive(...$dependenciesCollection)); + return $builder->build(); +} catch (Exception $e) {echo $e->getMessage();} diff --git a/config/factories/loggerFactory.php b/config/factories/loggerFactory.php new file mode 100644 index 0000000..f0b8491 --- /dev/null +++ b/config/factories/loggerFactory.php @@ -0,0 +1,2 @@ +pushHandler(new \Monolog\Handler\StreamHandler(__DIR__.'/../../var/logs/log'.date('Ymd').'.log')); diff --git a/config/factories/routerFactory.php b/config/factories/routerFactory.php new file mode 100644 index 0000000..03b27a4 --- /dev/null +++ b/config/factories/routerFactory.php @@ -0,0 +1,2 @@ +setSubtemplePath('templates'); \ No newline at end of file diff --git a/config/routes/main.json b/config/routes/main.json new file mode 100644 index 0000000..71c5560 --- /dev/null +++ b/config/routes/main.json @@ -0,0 +1,14 @@ +[ + { + "key": "/", + "routes": [ + {"action": "App\\Main\\Controllers\\IndexController", "method": "index", "params": ""} + ] + }, + { + "key": "[any]", + "routes": [ + {"action": "App\\Main\\Controllers\\IndexController", "method": "emptyAction", "params": ""} + ] + } +] \ No newline at end of file diff --git a/config/routes/main.yaml b/config/routes/main.yaml new file mode 100644 index 0000000..b1f8e52 --- /dev/null +++ b/config/routes/main.yaml @@ -0,0 +1,12 @@ +- key: "/" + routes: + - action: "App\\Main\\Controllers\\IndexController" + method: "index" + params: "" + +# Empty +- key: "[any]" + routes: + - action: "App\\Main\\Controllers\\IndexController" + method: "emptyAction" + params: "" \ No newline at end of file diff --git a/config/routes/main/09-main.yaml b/config/routes/main/09-main.yaml new file mode 100644 index 0000000..79ba360 --- /dev/null +++ b/config/routes/main/09-main.yaml @@ -0,0 +1,13 @@ +# Index +- key: "/" + routes: + - action: "App\\Main\\Controllers\\IndexController" + method: "index" + params: "" + +# Empty +- key: "[any]" + routes: + - action: "App\\Main\\Controllers\\IndexController" + method: "emptyAction" + params: "" diff --git a/config/routes/main/collection.php b/config/routes/main/collection.php new file mode 100644 index 0000000..aac5a79 --- /dev/null +++ b/config/routes/main/collection.php @@ -0,0 +1,9 @@ +usePutenv()->loadEnv(dirname(__DIR__).'/.env'); + +error_reporting(0); ini_set('display_errors','Off'); +if(getenv("APP_MODE") == 'DEV'){ + error_reporting(E_ALL); ini_set('display_errors','On'); +} + +$request = ServerRequestFactory::fromGlobals(); + +$app = new App(); +$response = $app->handler($request, (new Response())->withHeader("Content-Type", "text/html; charset=utf-8")); +(new ResponseEmitter())->emit($response); + + +if(getenv("APP_MODE") == 'DEV' && in_array("Dev", $response->getHeader("App-Mode"))){ + $app->syslogger()->dump("request", $request); + $app->syslogger()->dump("response", $response); + $app->syslogger()->dump("globals", [ + "ENV"=>$_ENV, + "GET"=>$request->getQueryParams(), + "POST"=>$request->getParsedBody(), + "COOKIE"=>$request->getCookieParams(), + "SESSION"=>$_SESSION ?? [], + "SERVER"=>$request->getServerParams() + ]); + $app->syslogger()->dump("kernel", $app); + Utils::addShutdownInfo($app->syslogger()->getLogs()); +} diff --git a/public/web/404.html b/public/web/404.html new file mode 100644 index 0000000..6eac0e4 --- /dev/null +++ b/public/web/404.html @@ -0,0 +1,10 @@ + + + + + 404 + + +

Error 404

+ + \ No newline at end of file diff --git a/public/web/500.html b/public/web/500.html new file mode 100644 index 0000000..4800988 --- /dev/null +++ b/public/web/500.html @@ -0,0 +1,10 @@ + + + + + 500 + + +

Error 500

+ + \ No newline at end of file diff --git a/public/web/main/css/style.css b/public/web/main/css/style.css new file mode 100644 index 0000000..41e304e --- /dev/null +++ b/public/web/main/css/style.css @@ -0,0 +1,18 @@ +body{font-family: Arimo, sans-serif; font-size: 15px; margin: 0; padding: 0;} +* { + scrollbar-width: thin; + scrollbar-color: #CCC #FFF +} +*::-webkit-scrollbar { + width: 10px; +} +*::-webkit-scrollbar-track { + background: #FFF; +} +*::-webkit-scrollbar-thumb { + background-color: #AAA; + border-radius: 20px; + border: 3px solid #FFF; +} + +h1{padding: 0 30px} \ No newline at end of file diff --git a/public/web/main/images/.gitkeep b/public/web/main/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/public/web/main/js/script.js b/public/web/main/js/script.js new file mode 100644 index 0000000..e69de29 diff --git a/public/web/main/sheet.html b/public/web/main/sheet.html new file mode 100644 index 0000000..ed412e8 --- /dev/null +++ b/public/web/main/sheet.html @@ -0,0 +1,19 @@ + + + + + + + Rmphp - <?=$this->getPoint('title')?> + + + + + getPoint('main')?> + + getPoint('jsscript')?> + + \ No newline at end of file diff --git a/public/web/source/.gitkeep b/public/web/source/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Common/Components/.gitkeep b/src/Common/Components/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Common/Controllers/AbstractController.php b/src/Common/Controllers/AbstractController.php new file mode 100644 index 0000000..a2d4525 --- /dev/null +++ b/src/Common/Controllers/AbstractController.php @@ -0,0 +1,94 @@ +container()->get($name); + } + catch (NotFoundExceptionInterface $notFoundException){ + $this->syslogger()->error($notFoundException->getMessage()); + } + catch (ContainerExceptionInterface $containerException){ + $this->syslogger()->error($containerException->getMessage()); + } + } + + /** + * @param \Throwable $throwable + * @param array $data + * @return void + */ + public function logException(\Throwable $throwable, array $data = []) : void { + $this->logger()->warning($throwable->getMessage()." on ".$throwable->getFile().":".$throwable->getLine(), $data); + } + + + /** + * @param string $name + * @param string $value + * @return void + */ + public function addHeader(string $name, string $value) : void { + $this->globals()->addHeader($name, $value); + } + + /** + * @param $html + * @param int $status + * @param array $headers + * @return ResponseInterface + */ + public function htmlResponse($html, int $status = 200, array $headers = []) : ResponseInterface { + return new HtmlResponse($html, $status, array_merge($this->globals()->response()->getHeaders(), $headers)); + } + + /** + * @param $text + * @param int $status + * @param array $headers + * @return ResponseInterface + */ + public function textResponse($text, int $status = 200, array $headers = []) : ResponseInterface { + $this->container()->set("showDebugLogs", false); + return new TextResponse($text, $status, array_merge($this->globals()->response()->getHeaders(), $headers)); + } + + /** + * @param array $array + * @param int $status + * @param array $headers + * @return ResponseInterface + */ + public function jsonResponse(array $array, int $status = 200, array $headers = []) : ResponseInterface { + $this->container()->set("showDebugLogs", false); + return new JsonResponse($array, $status, array_merge($this->globals()->response()->getHeaders(), $headers), JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT); + } + + /** + * @param string $url + * @param int $status + * @param array $headers + * @return ResponseInterface + */ + public function redirectResponse(string $url, int $status = 302, array $headers = []) : ResponseInterface { + $this->container()->set("showDebugLogs", false); + return new RedirectResponse($url, $status, array_merge($this->globals()->response()->getHeaders(), $headers)); + } + +} \ No newline at end of file diff --git a/src/Common/Controllers/AbstractPageController.php b/src/Common/Controllers/AbstractPageController.php new file mode 100644 index 0000000..00edf2d --- /dev/null +++ b/src/Common/Controllers/AbstractPageController.php @@ -0,0 +1,38 @@ +template()->addValue($point, $string); + } + + /** + * @param string $point + * @param string $subTempl + * @param array $resource + */ + public function templateSetSubtemple(string $point, string $subTempl, array $resource = []) : void { + $this->template()->setSubtemple($point, $subTempl, $resource); + } + + /** + * @param \Exception $exception + * @param array $data + * @return void + */ + public function exceptionPage(\Exception $exception, array $data = []) : void { + $this->logException($exception, $data); + $this->syslogger()->warning($exception->getMessage()." on ".$exception->getFile().":".$exception->getLine(), $data); + $this->templateSetSubtemple("main", "/main/errpage.tpl", [ + "errorText" => "Error: ".$exception->getMessage()." (".$exception->getCode().")"."" + ]); + } +} \ No newline at end of file diff --git a/src/Common/Controllers/NotFoundException.php b/src/Common/Controllers/NotFoundException.php new file mode 100644 index 0000000..5412b28 --- /dev/null +++ b/src/Common/Controllers/NotFoundException.php @@ -0,0 +1,7 @@ +data = $data; + } +} \ No newline at end of file diff --git a/src/Common/Services/AbstractService.php b/src/Common/Services/AbstractService.php new file mode 100644 index 0000000..f9ebcd9 --- /dev/null +++ b/src/Common/Services/AbstractService.php @@ -0,0 +1,10 @@ +data = $data; + } +} \ No newline at end of file diff --git a/src/Main/Components/.gitkeep b/src/Main/Components/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Main/Controllers/IndexController.php b/src/Main/Controllers/IndexController.php new file mode 100644 index 0000000..01f2595 --- /dev/null +++ b/src/Main/Controllers/IndexController.php @@ -0,0 +1,25 @@ +addHeader("App-Mode", "Dev"); + $this->template()->setValue("title", "Главная"); + $this->template()->setSubtemple("main", "main/index.tpl", [ + ]); + } + catch(ServiceException $exception){} + return true; + } + +} \ No newline at end of file diff --git a/src/Main/Domain/.gitkeep b/src/Main/Domain/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Main/Repository/DTO/.gitkeep b/src/Main/Repository/DTO/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Main/Repository/Interface/.gitkeep b/src/Main/Repository/Interface/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Main/Repository/Mysql/.gitkeep b/src/Main/Repository/Mysql/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Main/Services/.gitkeep b/src/Main/Services/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/templates/main/errpage.tpl b/templates/main/errpage.tpl new file mode 100644 index 0000000..4e716dd --- /dev/null +++ b/templates/main/errpage.tpl @@ -0,0 +1,9 @@ +
+
+
+
+ data->errorText))?$this->data->errorText:""?> +
+
+
+
diff --git a/templates/main/index.tpl b/templates/main/index.tpl new file mode 100644 index 0000000..df4dd5e --- /dev/null +++ b/templates/main/index.tpl @@ -0,0 +1,5 @@ +
+
+

Hellow

+
+
\ No newline at end of file