. */ namespace SP\Core\Bootstrap; use Closure; use Exception; use Klein\Response; use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerInterface; use Psr\Container\NotFoundExceptionInterface; use RuntimeException; use SP\Core\Exceptions\SessionTimeout; use SP\Core\HttpModuleBase; use SP\Modules\Web\Init as InitWeb; use SP\Util\Filter; /** * Bootstrap web interface */ final class BootstrapWeb extends BootstrapBase { protected HttpModuleBase $module; /** * @param \Psr\Container\ContainerInterface $container * * @return \SP\Core\Bootstrap\BootstrapWeb * * TODO: Inject needed classes */ public static function run(ContainerInterface $container): BootstrapWeb { logger('------------'); logger('Boostrap:web'); // TODO: remove self::$container = $container; try { /** @noinspection SelfClassReferencingInspection */ $bs = $container->get(BootstrapWeb::class); $bs->module = $container->get(InitWeb::class); $bs->handleRequest(); return $bs; } catch (NotFoundExceptionInterface|ContainerExceptionInterface $e) { processException($e); die($e->getMessage()); } } protected function configureRouter(): void { // Manage requests for web module $this->router->respond( ['GET', 'POST'], '@(?!/api\.php)', $this->manageWebRequest() ); } private function manageWebRequest(): Closure { return function ($request, $response, $service) { /** @var \Klein\Request $request */ /** @var \Klein\Response $response */ try { logger('WEB route'); /** @var \Klein\Request $request */ $route = Filter::getString($request->param('r', 'index/index')); if (!preg_match_all( '#(?P[a-zA-Z]+)(?:/(?P[a-zA-Z]+))?(?P(/[a-zA-Z\d.]+)+)?#', $route, $matches )) { throw new RuntimeException(self::OOPS_MESSAGE); } $controllerName = $matches['controller'][0]; $methodName = empty($matches['action'][0]) ? 'indexAction' : $matches['action'][0].'Action'; $methodParams = empty($matches['params'][0]) ? [] : Filter::getArray( explode( '/', trim( $matches['params'][0], '/' ) ) ); $controllerClass = self::getClassFor($controllerName); $this->initializePluginClasses(); if (!method_exists($controllerClass, $methodName)) { logger($controllerClass.'::'.$methodName); $response->code(404); throw new RuntimeException(self::OOPS_MESSAGE); } $this->setCors($response); $this->initializeCommon(); // TODO: remove?? if (APP_MODULE === 'web') { $this->module->initialize($controllerName); } logger( sprintf( 'Routing call: %s::%s::%s', $controllerClass, $methodName, print_r($methodParams, true) ) ); $controller = self::$container->get($controllerClass); return call_user_func_array([$controller, $methodName], $methodParams); } catch (SessionTimeout $sessionTimeout) { logger('Session timeout'); } catch (Exception $e) { processException($e); /** @var Response $response */ if ($response->status()->getCode() !== 404) { $response->code(503); } return __($e->getMessage()); } }; } }