19 Commits
1.0 ... 5.x

Author SHA1 Message Date
User
9fb52d116d 20250109#2 2025-01-09 02:22:38 +03:00
User
1ffad8d84a 20250109#1 2025-01-09 02:19:46 +03:00
User
1d37f96799 20240502#3 2024-05-02 11:22:52 +03:00
User
e500d67171 20240502#2 2024-05-02 11:21:57 +03:00
User
cf621dbaef 20240412#1 2024-04-12 02:43:39 +03:00
User
5eaf931847 20240410#8 2024-04-10 03:36:09 +03:00
User
efe3b0ad5a 20240410#4 2024-04-10 02:37:25 +03:00
User
d9a3deef90 20231113#2 2023-11-13 04:13:49 +03:00
User
0c121af290 20231113#1 2023-11-13 04:12:41 +03:00
User
7b03cf952e 20231010#7 2023-10-11 00:03:51 +03:00
User
33e3fba104 20231010#6 2023-10-11 00:00:54 +03:00
User
2a620798b3 20231009#1 2023-10-09 14:12:18 +03:00
User
7658fc88e6 20230926#3 2023-09-26 21:37:02 +03:00
User
5c79d63d6c 20230926#1 2023-09-26 16:34:19 +03:00
User
d43d4751a7 20230818#2 2023-08-18 01:48:17 +03:00
User
c681f88de4 20230818#1 2023-08-18 01:42:24 +03:00
User
d5a9d0fc10 20230626#3 2023-06-26 20:29:49 +03:00
User
407529f092 20230626#2 2023-06-26 20:13:30 +03:00
User
1f902c6b70 20230626#1 2023-06-26 19:58:04 +03:00
5 changed files with 42 additions and 139 deletions

View File

@@ -9,13 +9,7 @@ Stable version
```bash ```bash
composer require rmphp/kernel composer require rmphp/kernel
``` ```
```bash
composer require rmphp/kernel:"^1.0"
```
Dev version contains the latest changes
```bash ```bash
composer require rmphp/kernel:"1.0.x-dev" composer require rmphp/kernel:"^5.0"
``` ```

View File

@@ -12,7 +12,7 @@
"ext-yaml": "*", "ext-yaml": "*",
"psr/log": "^3.0.0", "psr/log": "^3.0.0",
"psr/container": "^1.0", "psr/container": "^1.0",
"rmphp/foundation": "^1.0" "rmphp/foundation": "^2.1"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

View File

@@ -4,6 +4,7 @@ declare(strict_types = 1);
namespace Rmphp\Kernel; namespace Rmphp\Kernel;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface; use Psr\Container\ContainerInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
@@ -34,6 +35,8 @@ class App extends Main {
public function handler(ServerRequestInterface $request, ResponseInterface $response) : ResponseInterface { public function handler(ServerRequestInterface $request, ResponseInterface $response) : ResponseInterface {
try{ try{
$this->init($request, $response); $this->init($request, $response);
$this->syslogger()->dump("Request", $request);
$this->syslogger()->dump("Router", $this->router);
$this->syslogger()->dump("routes", $this->appRoutes); $this->syslogger()->dump("routes", $this->appRoutes);
foreach ($this->appRoutes as $appRouteKey => $appHandler){ foreach ($this->appRoutes as $appRouteKey => $appHandler){
@@ -46,8 +49,8 @@ class App extends Main {
$this->syslogger()->log("handlers", "Err - Class ".$appHandler->className." is not exists"); $this->syslogger()->log("handlers", "Err - Class ".$appHandler->className." is not exists");
continue; continue;
} }
$controllers[$appRouteKey] = new $appHandler->className; $controllers[$appRouteKey] = ($this->container() instanceof ContainerInterface) ? $this->container()->get($appHandler->className) : new $appHandler->className;
$log = "OK - Class ".$appHandler->className; $log = "Class ".$appHandler->className;
if(!empty($appHandler->methodName)){ if(!empty($appHandler->methodName)){
if(!method_exists($appHandler->className, $appHandler->methodName)) { if(!method_exists($appHandler->className, $appHandler->methodName)) {
@@ -55,12 +58,10 @@ class App extends Main {
continue; continue;
} }
$response = (!empty($appHandler->params)) ? $controllers[$appRouteKey]->{$appHandler->methodName}(...$appHandler->params) : $controllers[$appRouteKey]->{$appHandler->methodName}(); $response = (!empty($appHandler->params)) ? $controllers[$appRouteKey]->{$appHandler->methodName}(...$appHandler->params) : $controllers[$appRouteKey]->{$appHandler->methodName}();
$log = "OK - Method ".$appHandler->className."/".$appHandler->methodName; $log = "Method ".$appHandler->className."/".$appHandler->methodName;
} }
$this->syslogger()->log("handlers", $log); $this->syslogger()->log("handlers", "OK - ".$log);
/**
* 1. Если на этапе итерации уже получен ответ ResponseInterface - досрочно отдаем результат в эмиттер
*/
if($response instanceof ResponseInterface) { if($response instanceof ResponseInterface) {
return $response; return $response;
} }
@@ -68,16 +69,7 @@ class App extends Main {
} }
} }
/** /**
* 2. Если итерации закончились и задан обьект Content им создаем результат для эмиттера * Отдаем пустой результат
*/
if($this->template() && !empty($this->template()->getResponse())){
$body = $this->globals()->response()->getBody();
$body->write($this->template()->getResponse());
$body->rewind();
return $this->globals()->response()->withBody($body);
}
/**
* 3. Отдаем пустой результат если не определен шаблонизатор
*/ */
return $this->defaultPage(404); return $this->defaultPage(404);
} }
@@ -85,12 +77,12 @@ class App extends Main {
if($this->logger()) $this->logger()->warning($appException->getMessage()." on ".$appException->getFile().":".$appException->getLine()); if($this->logger()) $this->logger()->warning($appException->getMessage()." on ".$appException->getFile().":".$appException->getLine());
$this->syslogger()->warning("AppException: ".$appException->getMessage()); $this->syslogger()->warning("AppException: ".$appException->getMessage());
} }
catch (\Exception $exception) { catch (\Exception|ContainerExceptionInterface $exception) {
if($this->logger()) $this->logger()->warning($exception->getMessage()." on ".$exception->getFile().":".$exception->getLine()); if($this->logger()) $this->logger()->warning($exception->getMessage()." on ".$exception->getFile().":".$exception->getLine());
$this->syslogger()->warning("Exception: ".$exception->getMessage()." : ".$exception->getFile()." : ".$exception->getLine()); $this->syslogger()->warning("Exception: ".$exception->getMessage()." : ".$exception->getFile()." : ".$exception->getLine());
} }
catch (AppError $appError){ catch (AppError $appError){
if($this->logger()) $this->logger()->warning($appError->getMessage()." on ".$appError->getFile().":".$appError->getLine()); if($this->logger()) $this->logger()->error($appError->getMessage()." on ".$appError->getFile().":".$appError->getLine());
$this->syslogger()->error("Error: ".$appError->getMessage()." : ".$appError->getFile()." : ".$appError->getLine()); $this->syslogger()->error("Error: ".$appError->getMessage()." : ".$appError->getFile()." : ".$appError->getLine());
} }
catch (\Error $error) { catch (\Error $error) {
@@ -98,7 +90,7 @@ class App extends Main {
$this->syslogger()->error("Error: ".$error->getMessage()." : ".$error->getFile()." : ".$error->getLine()); $this->syslogger()->error("Error: ".$error->getMessage()." : ".$error->getFile()." : ".$error->getLine());
} }
/** /**
* 4. Отдаем ошибку без шаблона * Отдаем после ошибки
*/ */
return $this->defaultPage(501); return $this->defaultPage(501);
} }
@@ -109,10 +101,7 @@ class App extends Main {
*/ */
private function defaultPage(int $code) : ResponseInterface{ private function defaultPage(int $code) : ResponseInterface{
if(is_file($this->baseDir.'/'.getenv("PAGE".$code))){ if(is_file($this->baseDir.'/'.getenv("PAGE".$code))){
$body = $this->globals()->response()->getBody(); $this->globals()->response()->getBody()->write(file_get_contents($this->baseDir.'/'.getenv("PAGE".$code)));
$body->write(file_get_contents($this->baseDir.'/'.getenv("PAGE".$code)));
$body->rewind();
return $this->globals()->response()->withBody($body)->withStatus($code);
} }
return $this->globals()->response()->withStatus($code); return $this->globals()->response()->withStatus($code);
} }
@@ -155,11 +144,6 @@ class App extends Main {
if(is_file($this->baseDir."/".getenv("APP_NODES_FILE"))){ if(is_file($this->baseDir."/".getenv("APP_NODES_FILE"))){
$nodes = include_once $this->baseDir."/".getenv("APP_NODES_FILE"); $nodes = include_once $this->baseDir."/".getenv("APP_NODES_FILE");
} }
for ($appNodeNum = 1; getenv("APP_NODE".$appNodeNum); $appNodeNum++){
$nodesCollection[] = json_decode(getenv("APP_NODE".$appNodeNum), true);
}
if(isset($nodesCollection)) $nodes = $nodesCollection;
if(empty($nodes) || !is_array($nodes)) throw AppException::emptyAppNodes(); if(empty($nodes) || !is_array($nodes)) throw AppException::emptyAppNodes();
$this->getActions($nodes); $this->getActions($nodes);
} }
@@ -170,7 +154,7 @@ class App extends Main {
private function getActions(array $appNodes) : void { private function getActions(array $appNodes) : void {
foreach ($appNodes as $appNode){ foreach ($appNodes as $appNode){
// по умолчанию точка монтирования ровна корню // по умолчанию точка монтирования от корня
$mountKey = (!empty($appNode['key'])) ? $appNode['key'] : '/'; $mountKey = (!empty($appNode['key'])) ? $appNode['key'] : '/';
// если url начинается не с точки монтирования смотрим далее // если url начинается не с точки монтирования смотрим далее
@@ -182,20 +166,22 @@ class App extends Main {
$params = (!empty($appNode['params']) && is_string($appNode['params'])) ? explode(",",str_replace(" ", "", $appNode['params'])) : []; $params = (!empty($appNode['params']) && is_string($appNode['params'])) ? explode(",",str_replace(" ", "", $appNode['params'])) : [];
$this->appRoutes[] = new MatchObject($className, $methodName, $params); $this->appRoutes[] = new MatchObject($className, $methodName, $params);
} }
elseif(!empty($appNode['router']) && is_array($appNode['router'])){
if(empty($this->router)) throw AppError::invalidRequiredObject("Application config without router");
$this->router->setStartPoint($mountKey);
$this->router->withRules($appNode['router']);
$routes = $this->router->match($this->globals()->request()) ?? [];
foreach ($routes as $route){
$this->appRoutes[] = $route;
}
}
elseif(!empty($appNode['router']) && file_exists($this->baseDir."/".$appNode['router'])){ elseif(!empty($appNode['router']) && file_exists($this->baseDir."/".$appNode['router'])){
if(empty($this->router)) throw AppError::invalidRequiredObject("Application config without router"); if(empty($this->router)) throw AppError::invalidRequiredObject("Application config without router");
$this->router->setStartPoint($mountKey); $this->router->setStartPoint($mountKey);
ob_start(); $routes = include_once $this->baseDir."/".$appNode['router']; ob_end_clean();
if(pathinfo($this->baseDir."/".$appNode['router'])['extension'] == "php") { if(is_array($routes)) $this->router->withRules($routes);
$this->router->withRules(include_once $this->baseDir."/".$appNode['router']);
}
elseif(pathinfo($this->baseDir."/".$appNode['router'])['extension'] == "json") {
$this->router->withRules(json_decode(file_get_contents($this->baseDir."/".$appNode['router']), true));
}
elseif(pathinfo($this->baseDir."/".$appNode['router'])['extension'] == "yaml") {
$this->router->withRules(yaml_parse_file($this->baseDir."/".$appNode['router']));
}
$routes = $this->router->match($this->globals()->request()) ?? []; $routes = $this->router->match($this->globals()->request()) ?? [];
foreach ($routes as $route){ foreach ($routes as $route){

View File

@@ -4,12 +4,12 @@ namespace Rmphp\Kernel;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\UploadedFileInterface;
class Globals { class Globals {
private ServerRequestInterface $request; private ServerRequestInterface $request;
private ResponseInterface $response; private ResponseInterface $response;
private Session $session;
const INT = "INT"; const INT = "INT";
const STRING = "STRING"; const STRING = "STRING";
@@ -83,16 +83,6 @@ class Globals {
return (!empty($name)) ? isset($this->request->getCookieParams()[$name]) : !empty($this->request->getCookieParams()); return (!empty($name)) ? isset($this->request->getCookieParams()[$name]) : !empty($this->request->getCookieParams());
} }
/**
* @param string $name
* @return bool
*/
public function isSession(string $name = "") : bool {
if(!class_exists(Session::class)) return false;
if(!isset($this->session)) $this->session = new Session();
return (!empty($name)) ? isset($this->session->getSession()[$name]) : !empty($this->session->getSession());
}
/** /**
* @param string $name * @param string $name
* @return bool * @return bool
@@ -139,21 +129,17 @@ class Globals {
/** /**
* @param string $name * @param string $name
* @param string $type * @return array|UploadedFileInterface|null
* @return array|int|string
*/ */
public function session(string $name = "", string $type = "") { public function files(string $name = ""): array|UploadedFileInterface|null {
if(!class_exists(Session::class)) return null; $name = strtolower($name);
if(!isset($this->session)) $this->session = new Session(); $var = $this->request->getUploadedFiles();
return $this->onGlobal($this->session->getSession(), $name, $type); if (!empty($name))
} {
if (!isset($var[$name])) return null;
/** return $var[$name];
* @param string $name }
* @return array|int|string return $var;
*/
public function files(string $name = "") {
return $this->onGlobal($this->request->getUploadedFiles(), $name);
} }
/** /**
@@ -174,18 +160,6 @@ class Globals {
$this->setResponse($this->response->withAddedHeader($name, $value)); $this->setResponse($this->response->withAddedHeader($name, $value));
} }
/**
* @param string $name
* @param $value
* @return void
*/
public function setSession(string $name, $value = null) : void {
if(class_exists(Session::class)) {
if(!isset($this->session)) $this->session = new Session();
$this->session->setSession($name, $value);
}
}
/** /**
* @param string $name * @param string $name
* @param string $value * @param string $value
@@ -209,17 +183,6 @@ class Globals {
$this->addHeader("Set-Cookie", implode("; ", $cookie)); $this->addHeader("Set-Cookie", implode("; ", $cookie));
} }
/**
* @param string|null $name
* @return void
*/
public function clearSession(string $name = null) : void{
if(class_exists(Session::class)) {
if(!isset($this->session)) $this->session = new Session();
$this->session->clearSession($name);
}
}
/** /**
* @param string $name * @param string $name
* @param string $path * @param string $path
@@ -232,14 +195,13 @@ class Globals {
} }
/** /**
* @param array $var * @param array $var
* @param string $name * @param string $name
* @param string $type * @param string $type
* @return array|int|string * @return mixed
*/ */
private function onGlobal(array $var, string $name, string $type = "") { private function onGlobal(array $var, string $name, string $type = ""): mixed {
$name = strtolower($name); $name = strtolower($name);
if (!empty($name)) if (!empty($name))
{ {

View File

@@ -1,39 +0,0 @@
<?php
namespace Rmphp\Kernel;
class Session {
public function __construct(string $name = "usi") {
if(session_status() == PHP_SESSION_NONE) {
session_name($name);
session_start();
}
}
/**
* @return array
*/
public function getSession() : array {
return $_SESSION;
}
/**
* @param string $name
* @param $value
*/
public function setSession(string $name, $value = null) : void {
$_SESSION[$name] = $value;
}
/**
* @param string|null $name
* @return void
*/
public function clearSession(string $name = null) : void {
if (isset($name)) unset($_SESSION[$name]);
else $_SESSION = [];
}
}