8 Commits
4.0 ... 6.x

Author SHA1 Message Date
User
6cc61749c7 20250303#2 2025-03-03 16:16:31 +03:00
User
6bd9e68d91 20250303#1 2025-03-03 00:31:13 +03:00
User
f5f51ef99c 20250302#5 2025-03-02 21:37:35 +03:00
User
97f6629907 20250302#1 2025-03-02 19:13:32 +03:00
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
6 changed files with 202 additions and 106 deletions

View File

@@ -11,5 +11,5 @@ composer require rmphp/kernel
``` ```
```bash ```bash
composer require rmphp/kernel:"^3.0" composer require rmphp/kernel:"^6.0"
``` ```

View File

@@ -12,12 +12,12 @@
"ext-yaml": "*", "ext-yaml": "*",
"psr/log": "^3.0.0", "psr/log": "^3.0.0",
"psr/container": "^1.0", "psr/container": "^1.0",
"rmphp/foundation": "^2.0" "rmphp/foundation": "^3.0"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Rmphp\\Kernel\\": "src/" "Rmphp\\Kernel\\": "src/"
} }
} }
} }

View File

@@ -34,7 +34,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->setGlobals($request, $response);
$this->init();
$this->syslogger()->dump("Request", $request); $this->syslogger()->dump("Request", $request);
$this->syslogger()->dump("Router", $this->router); $this->syslogger()->dump("Router", $this->router);
$this->syslogger()->dump("routes", $this->appRoutes); $this->syslogger()->dump("routes", $this->appRoutes);
@@ -42,7 +43,7 @@ class App extends Main {
foreach ($this->appRoutes as $appRouteKey => $appHandler){ foreach ($this->appRoutes as $appRouteKey => $appHandler){
if(!$appHandler instanceof MatchObject) continue; if(!$appHandler instanceof MatchObject) continue;
$response = null; $handlerResponse = null;
if(!empty($appHandler->className)){ if(!empty($appHandler->className)){
if(!class_exists($appHandler->className)) { if(!class_exists($appHandler->className)) {
@@ -57,15 +58,15 @@ class App extends Main {
$this->syslogger()->log("handlers", "Err - Method ".$appHandler->className."/".$appHandler->methodName." is not exists"); $this->syslogger()->log("handlers", "Err - Method ".$appHandler->className."/".$appHandler->methodName." is not exists");
continue; continue;
} }
$response = (!empty($appHandler->params)) ? $controllers[$appRouteKey]->{$appHandler->methodName}(...$appHandler->params) : $controllers[$appRouteKey]->{$appHandler->methodName}(); $handlerResponse = (!empty($appHandler->params)) ? $controllers[$appRouteKey]->{$appHandler->methodName}(...$appHandler->params) : $controllers[$appRouteKey]->{$appHandler->methodName}();
$log = "Method ".$appHandler->className."/".$appHandler->methodName; $log = "Method ".$appHandler->className."/".$appHandler->methodName;
} }
$this->syslogger()->log("handlers", "OK - ".$log); $this->syslogger()->log("handlers", "OK - ".$log);
if($response instanceof ResponseInterface) { if($handlerResponse instanceof ResponseInterface) {
return $response; return $handlerResponse;
} }
elseif($response === false) break; elseif($handlerResponse === false) break;
} }
} }
/** /**
@@ -107,15 +108,10 @@ class App extends Main {
} }
/** /**
* @param ServerRequestInterface $request
* @param ResponseInterface $response
* @return void * @return void
* @throws AppException * @throws AppException
*/ */
private function init(ServerRequestInterface $request, ResponseInterface $response) : void { private function init() : void {
$this->setGlobals($request, $response);
// init factories // init factories
if(is_file($this->baseDir."/".getenv("APP_COMPONENTS_FILE"))){ if(is_file($this->baseDir."/".getenv("APP_COMPONENTS_FILE"))){
$components = include_once $this->baseDir."/".getenv("APP_COMPONENTS_FILE"); $components = include_once $this->baseDir."/".getenv("APP_COMPONENTS_FILE");
@@ -163,8 +159,7 @@ class App extends Main {
if(!empty($appNode['action'])){ if(!empty($appNode['action'])){
$className = $appNode['action']; $className = $appNode['action'];
$methodName = $appNode['method']; $methodName = $appNode['method'];
$params = (!empty($appNode['params']) && is_string($appNode['params'])) ? explode(",",str_replace(" ", "", $appNode['params'])) : []; $this->appRoutes[] = new MatchObject($className, $methodName);
$this->appRoutes[] = new MatchObject($className, $methodName, $params);
} }
elseif(!empty($appNode['router']) && is_array($appNode['router'])){ elseif(!empty($appNode['router']) && is_array($appNode['router'])){
if(empty($this->router)) throw AppError::invalidRequiredObject("Application config without router"); if(empty($this->router)) throw AppError::invalidRequiredObject("Application config without router");
@@ -190,4 +185,4 @@ class App extends Main {
} }
} }
} }
} }

186
src/AppCli.php Normal file
View File

@@ -0,0 +1,186 @@
<?php
declare(strict_types = 1);
namespace Rmphp\Kernel;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Log\LoggerInterface;
use Rmphp\Foundation\Exceptions\AppError;
use Rmphp\Foundation\Exceptions\AppException;
use Rmphp\Foundation\RouterInterface;
use Rmphp\Foundation\MatchObject;
class AppCli extends Main {
private string $baseDir;
private array $appRoutes = [];
private RouterInterface $router;
public function __construct() {
$this->baseDir = dirname(__DIR__, 4);
}
/**
* @param ServerRequestInterface $request
* @param ResponseInterface $response
* @return ResponseInterface
*/
public function handler(ServerRequestInterface $request, ResponseInterface $response) : ResponseInterface {
try{
$this->setGlobals($request, $response);
$this->init();
$this->syslogger()->dump("Request", $request);
$this->syslogger()->dump("Router", $this->router);
$this->syslogger()->dump("routes", $this->appRoutes);
foreach ($this->appRoutes as $appRouteKey => $appHandler){
if(!$appHandler instanceof MatchObject) continue;
$handlerResponse = null;
if(!empty($appHandler->className)){
if(!class_exists($appHandler->className)) {
$logs[] = "Err - Class ".$appHandler->className." is not exists";
continue;
}
$controllers[$appRouteKey] = ($this->container() instanceof ContainerInterface) ? $this->container()->get($appHandler->className) : new $appHandler->className;
$log = "Class ".$appHandler->className;
if(!empty($appHandler->methodName)){
if(!method_exists($appHandler->className, $appHandler->methodName)) {
$logs[] = "Err - Method ".$appHandler->className."/".$appHandler->methodName." is not exists";
continue;
}
$handlerResponse = (!empty($appHandler->params)) ? $controllers[$appRouteKey]->{$appHandler->methodName}(...$appHandler->params) : $controllers[$appRouteKey]->{$appHandler->methodName}();
$log = "Method ".$appHandler->className."/".$appHandler->methodName;
}
$logs[] = "OK - ".$log;
if($handlerResponse instanceof ResponseInterface) {
return $handlerResponse;
}
elseif($handlerResponse === false) break;
}
}
if(!isset($handlerResponse)) {
return (isset($logs)) ? $this->defaultPage(implode(PHP_EOL, $logs)) : $this->defaultPage("Скрипт не найден");
}
return $this->globals()->response();
}
catch (AppException $appException){
if($this->logger()) $this->logger()->warning($appException->getMessage()." on ".$appException->getFile().":".$appException->getLine());
$error = "AppException: ".$appException->getMessage()." on ".$appException->getFile().":".$appException->getLine();
}
catch (\Exception|ContainerExceptionInterface $exception) {
if($this->logger()) $this->logger()->warning($exception->getMessage()." on ".$exception->getFile().":".$exception->getLine());
$error = "Exception: ".$exception->getMessage()." on ".$exception->getFile().":".$exception->getLine();
}
catch (AppError $appError){
if($this->logger()) $this->logger()->error($appError->getMessage()." on ".$appError->getFile().":".$appError->getLine());
$error = "AppError: ".$appError->getMessage()." on ".$appError->getFile().":".$appError->getLine();
}
catch (\Error $error) {
if($this->logger()) $this->logger()->error($error->getMessage()." on ".$error->getFile().":".$error->getLine());
$error = "Error: ".$error->getMessage()." on ".$error->getFile().":".$error->getLine();
}
/**
* Отдаем после ошибки
*/
return $this->defaultPage('Ошибка при выполнении. '.$error ?? "");
}
/**
* @param string $error
* @return ResponseInterface
*/
private function defaultPage(string $error) : ResponseInterface{
$this->globals()->response()->getBody()->write($error);
return $this->globals()->response();
}
/**
* @return void
* @throws AppException
*/
private function init() : void {
// init factories
if(is_file($this->baseDir."/".getenv("APP_COMPONENTS_FILE"))){
$components = include_once $this->baseDir."/".getenv("APP_COMPONENTS_FILE");
if(!empty($components) && is_array($components)){
foreach ($components as $componentName => $componentValue){
if(empty($componentValue)) {
continue;
}
elseif(is_object($componentValue)){
$componentObject = $componentValue;
}
elseif(!file_exists($this->baseDir.'/'.$componentValue) || !is_object($componentObject = require $this->baseDir.'/'.$componentValue)){
throw AppException::invalidObject($componentValue);
}
switch (true){
case ($componentObject instanceof ContainerInterface): $this->setContainer($componentObject); break;
case ($componentObject instanceof LoggerInterface): $this->setLogger($componentObject); break;
case ($componentObject instanceof RouterInterface): $this->router = $componentObject; break;
}
}
}
}
// app nodes
if(is_file($this->baseDir."/".getenv("CLI_NODES_FILE"))){
$nodes = include_once $this->baseDir."/".getenv("CLI_NODES_FILE");
}
elseif(is_file($this->baseDir."/".getenv("APP_NODES_FILE"))){
$nodes = include_once $this->baseDir."/".getenv("APP_NODES_FILE");
}
if(empty($nodes) || !is_array($nodes)) throw AppException::emptyAppNodes();
$this->getActions($nodes);
}
/**
* @param array $appNodes
*/
private function getActions(array $appNodes) : void {
foreach ($appNodes as $appNode){
// по умолчанию точка монтирования от корня
$mountKey = (!empty($appNode['key'])) ? $appNode['key'] : "";
// если url начинается не с точки монтирования смотрим далее
if (0 !== (strpos($this->globals()->request()->getServerParams()['argv'][1], $mountKey))) continue;
if(!empty($appNode['action'])){
$className = $appNode['action'];
$methodName = $appNode['method'];
$this->appRoutes[] = new MatchObject($className, $methodName);
}
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->withSet($appNode['router']);
$routes = $this->router->matchByArgv($this->globals()->request()) ?? [];
foreach ($routes as $route){
$this->appRoutes[] = $route;
}
}
elseif(!empty($appNode['router']) && file_exists($this->baseDir."/".$appNode['router'])){
if(empty($this->router)) throw AppError::invalidRequiredObject("Application config without router");
$this->router->setStartPoint($mountKey);
ob_start(); $routes = include_once $this->baseDir."/".$appNode['router']; ob_end_clean();
if(is_array($routes)) $this->router->withSet($routes);
$routes = $this->router->matchByArgv($this->globals()->request()) ?? [];
foreach ($routes as $route){
$this->appRoutes[] = $route;
}
}
}
}
}

View File

@@ -10,7 +10,6 @@ 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";
@@ -84,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
@@ -138,17 +127,6 @@ class Globals {
return $this->onGlobal($this->request->getCookieParams(), $name, $type); return $this->onGlobal($this->request->getCookieParams(), $name, $type);
} }
/**
* @param string $name
* @param string $type
* @return array|int|string
*/
public function session(string $name = "", string $type = "") {
if(!class_exists(Session::class)) return null;
if(!isset($this->session)) $this->session = new Session();
return $this->onGlobal($this->session->getSession(), $name, $type);
}
/** /**
* @param string $name * @param string $name
* @return array|UploadedFileInterface|null * @return array|UploadedFileInterface|null
@@ -182,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
@@ -217,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
@@ -240,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))
{ {
@@ -266,4 +220,4 @@ class Globals {
return $var; return $var;
} }
} }

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 = [];
}
}