Skip to content

Commit d99da4a

Browse files
committed
Customization plugin's path and uri :)
1 parent cc754dd commit d99da4a

3 files changed

Lines changed: 35 additions & 67 deletions

File tree

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
GNU AFFERO GENERAL PUBLIC LICENSE
1+
GNU AFFERO GENERAL PUBLIC LICENSE
22
Version 3, 19 November 2007
33

44
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>

src/App.php

Lines changed: 25 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
use Triangle\Engine\Config;
4949
use Triangle\Engine\Context;
5050
use Triangle\Engine\Path;
51+
use Triangle\Engine\Plugin;
5152
use Triangle\Exception\ExceptionHandler;
5253
use Triangle\Exception\ExceptionHandlerInterface;
5354
use Triangle\Middleware\Bootstrap as Middleware;
@@ -169,7 +170,6 @@ public function onWebsocketConnect(TcpConnection &$connection, Http\Request $req
169170
str_contains($path, "\0")
170171
) {
171172
// Логирование небезопасного URL и закрытие соединения с кодом 422
172-
Server::log('Небезопасный URL: ' . $path . PHP_EOL);
173173
static::close_http($connection, 422);
174174
return null;
175175
}
@@ -200,32 +200,31 @@ public function onWebsocketConnect(TcpConnection &$connection, Http\Request $req
200200
// Определение контроллера и действия
201201
if (is_array($callback)) {
202202
$controller = $callback[0];
203-
$plugin = static::getPluginByClass($controller);
203+
$plugin = Plugin::app_by_class($controller);
204204
$app = static::getAppByController($controller);
205205
$action = static::getRealMethod($controller, $callback[1]) ?? '';
206206
} else {
207-
$plugin = static::getPluginByPath($path);
207+
$plugin = Plugin::app_by_path($path);
208208
}
209209

210210
// Получение callback для маршрута
211-
$callback = static::getCallback($plugin, $app, $callback, $args);
211+
$callback = static::getCallback($plugin, $callback, $args);
212212
break;
213213
case Dispatcher::NOT_FOUND:
214214
// Маршрут не найден
215215
$route = null;
216216
$controllerAndAction = static::parseControllerAction($path);
217-
$plugin = $controllerAndAction['plugin'] ?? static::getPluginByPath($path);
217+
$plugin = $controllerAndAction['plugin'] ?? Plugin::app_by_path($path);
218218

219219
$app = $controllerAndAction['app'];
220220
$controller = $controllerAndAction['controller'];
221221
$action = $controllerAndAction['action'];
222222

223223
// Получение callback для контроллера и действия
224-
$callback = static::getCallback($plugin, $app, [$controller, $action]);
224+
$callback = static::getCallback($plugin, [$controller, $action]);
225225
break;
226226
case Dispatcher::METHOD_NOT_ALLOWED:
227227
// Метод не поддерживается
228-
Server::log('Метод GET не поддерживается для ' . $path . PHP_EOL);
229228
static::close_http($connection, 405);
230229
return null;
231230
}
@@ -274,7 +273,6 @@ public function onWebsocketConnect(TcpConnection &$connection, Http\Request $req
274273
}, $callback);
275274
}
276275

277-
Server::log('Рукопожатие успешно: ' . $path . PHP_EOL);
278276
return $callback($request);
279277
} catch (Throwable $e) {
280278
// Обработка исключений и закрытие соединения
@@ -446,11 +444,11 @@ public static function close_http(TcpConnection $connection, int|Response $statu
446444
*/
447445
protected static function exceptionResponse(Throwable $e, mixed $request): Response
448446
{
449-
try {
450-
// Получение приложения и плагина из запроса
451-
$app = $request->app ?: '';
452-
$plugin = $request->plugin ?: '';
447+
// Получение приложения и плагина из запроса
448+
$app = $request?->app ?: '';
449+
$plugin = $request?->plugin ?: '';
453450

451+
try {
454452
// Получение конфигурации обработчика исключений
455453
$exceptionConfig = static::config($plugin, 'exception');
456454
$defaultException = $exceptionConfig[''] ?? ExceptionHandler::class;
@@ -514,13 +512,13 @@ public static function server(): ?Server
514512
*
515513
* @param string $plugin Плагин.
516514
* @param string $key Ключ конфигурации.
517-
* @param mixed $default Значение по умолчанию.
515+
* @param mixed|null $default Значение по умолчанию.
518516
* @return array|mixed|null Возвращает значение конфигурации или значение по умолчанию.
519517
*/
520-
protected static function config(string $plugin, string $key, $default = null): mixed
518+
protected static function config(string $plugin, string $key, mixed $default = null): mixed
521519
{
522520
// Получаем значение конфигурации для указанного плагина и ключа
523-
return Config::get($plugin ? "plugin.$plugin.$key" : $key, $default);
521+
return Config::get($plugin ? config('app.plugin_alias', 'plugin') . ".$plugin.$key" : $key, $default);
524522
}
525523

526524
/**
@@ -538,20 +536,19 @@ public static function container(string $plugin = ''): ContainerInterface|array|
538536
/**
539537
* Функция для получения обратного вызова.
540538
*
541-
* @param string $plugin Плагин.
542-
* @param string $app Приложение.
539+
* @param string|null $plugin Плагин.
543540
* @param mixed $call Вызов.
544541
* @param array|null $args Аргументы.
545542
* @return callable|Closure Возвращает обратный вызов.
546543
* @throws ContainerExceptionInterface
547544
* @throws NotFoundExceptionInterface
548545
* @throws ReflectionException
549546
*/
550-
protected static function getCallback(string $plugin, string $app, mixed $call, array $args = null): callable|Closure
547+
protected static function getCallback(?string $plugin, mixed $call, array $args = null): callable|Closure
551548
{
552549
// Преобразование аргументов в массив значений, если они не равны null
553550
$args = $args === null ? null : array_values($args);
554-
$middlewares = [];
551+
$plugin ??= '';
555552

556553
// Проверяем, нужно ли внедрять зависимости в вызов
557554
$needInject = static::isNeedInject($call, $args);
@@ -713,20 +710,6 @@ protected static function resolveInject(string $plugin, array|Closure $call): Cl
713710
};
714711
}
715712

716-
/**
717-
* @param string $controllerClass
718-
* @return string
719-
*/
720-
public static function getPluginByClass(string $controllerClass): string
721-
{
722-
$controllerClass = trim($controllerClass, '\\');
723-
$tmp = explode('\\', $controllerClass, 3);
724-
if ($tmp[0] !== 'plugin') {
725-
return '';
726-
}
727-
return $tmp[1] ?? '';
728-
}
729-
730713
/**
731714
* @param string $controllerClass
732715
* @return mixed|string
@@ -735,7 +718,7 @@ protected static function getAppByController(string $controllerClass): mixed
735718
{
736719
$controllerClass = trim($controllerClass, '\\');
737720
$tmp = explode('\\', $controllerClass, 5);
738-
$pos = $tmp[0] === 'plugin' ? 3 : 1;
721+
$pos = $tmp[0] === config('app.plugin_alias', 'plugin') ? 3 : 1;
739722
if (!isset($tmp[$pos])) {
740723
return '';
741724
}
@@ -760,26 +743,6 @@ protected static function getRealMethod(string $class, string $method): string
760743
return $method;
761744
}
762745

763-
/**
764-
* Функция для получения плагина по пути.
765-
*
766-
* @param string $path Путь.
767-
* @return string Возвращает имя плагина, если он найден, иначе возвращает пустую строку.
768-
*/
769-
public static function getPluginByPath(string $path): string
770-
{
771-
// Удаляем слэши с начала и конца пути
772-
$path = trim($path, '/');
773-
// Разбиваем путь на части
774-
$tmp = explode('/', $path, 3);
775-
// Если первая часть пути не равна 'app', возвращаем пустую строку
776-
if ($tmp[0] !== 'app') {
777-
return '';
778-
}
779-
// Возвращаем вторую часть пути (имя плагина) или пустую строку, если она не существует
780-
return $tmp[1] ?? '';
781-
}
782-
783746
/**
784747
* Функция для разбора контроллера и действия из пути.
785748
*
@@ -797,19 +760,15 @@ protected static function parseControllerAction(string $path): false|array
797760
return $cache[$path];
798761
}
799762

800-
// Разбиваем путь на части
801-
$pathExplode = explode('/', trim($path, '/'));
802-
803763
// Проверяем, является ли путь плагином
804-
$isPlugin = isset($pathExplode[1]) && $pathExplode[0] === 'app';
805-
806-
// Получаем префиксы для конфигурации, пути и класса
807-
$configPrefix = $isPlugin ? "plugin.$pathExplode[1]." : '';
808-
$pathPrefix = $isPlugin ? "/app/$pathExplode[1]" : '';
809-
$classPrefix = $isPlugin ? "plugin\\$pathExplode[1]" : '';
764+
$plugin = Plugin::app_by_path($path);
810765

811766
// Получаем суффикс контроллера из конфигурации
812-
$suffix = Config::get("{$configPrefix}app.controller_suffix", '');
767+
$suffix = static::config($plugin, 'app.controller_suffix', '');
768+
769+
// Получаем префиксы для конфигурации, пути и класса
770+
$pathPrefix = $plugin ? "/" . config('app.plugin_uri', 'app') . "/$plugin" : '';
771+
$classPrefix = $plugin ? config('app.plugin_alias', 'plugin') . "\\$plugin" : '';
813772

814773
// Получаем относительный путь
815774
$relativePath = trim(substr($path, strlen($pathPrefix)), '/');
@@ -900,7 +859,7 @@ protected static function getControllerAction(string $controllerClass, string $a
900859
// Если класс контроллера и действие найдены, возвращаем информацию о них
901860
if (($controllerClass = static::getController($controllerClass)) && ($action = static::getAction($controllerClass, $action))) {
902861
return [
903-
'plugin' => static::getPluginByClass($controllerClass),
862+
'plugin' => Plugin::app_by_class($controllerClass),
904863
'app' => static::getAppByController($controllerClass),
905864
'controller' => $controllerClass,
906865
'action' => $action
@@ -927,7 +886,7 @@ protected static function getController(string $controllerClass): false|string
927886

928887
// Разбиваем полное имя класса на части
929888
$explodes = explode('\\', strtolower(ltrim($controllerClass, '\\')));
930-
$basePath = $explodes[0] === 'plugin' ? Path::basePath('plugin') : app_path();
889+
$basePath = $explodes[0] === config('app.plugin_alias', 'plugin') ? Path::basePath(config('app.plugin_alias', 'plugin')) : app_path();
931890
unset($explodes[0]);
932891
$fileName = array_pop($explodes) . '.php';
933892
$found = true;

src/Config/app.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
return [
4+
'debug' => (bool)env('APP_DEBUG', false),
5+
'name' => env('APP_NAME', 'Triangle App'),
6+
7+
'controller_suffix' => env('CONTROLLER_SUFFIX', ''),
8+
'controller_reuse' => env('CONTROLLER_REUSE', true),
9+
];

0 commit comments

Comments
 (0)