. */ namespace SP\Modules\Web; use Closure; use Exception; use Klein\Request; use Klein\Response; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; use RuntimeException; use SP\Core\Bootstrap\BootstrapBase; use SP\Core\Bootstrap\RouteContext; use SP\Domain\Core\Bootstrap\BootstrapInterface; use SP\Domain\Core\Bootstrap\ModuleInterface; use SP\Domain\Core\Exceptions\SessionTimeout; use SP\Util\Filter; use function SP\__; use function SP\logger; use function SP\processException; /** * Class Bootstrap */ final class Bootstrap extends BootstrapBase { protected ModuleInterface $module; public static function run(BootstrapInterface $bootstrap, ModuleInterface $initModule): void { logger('------------'); logger('Boostrap:web'); try { $bootstrap->module = $initModule; $bootstrap->handleRequest(); } catch (NotFoundExceptionInterface|ContainerExceptionInterface $e) { processException($e); die($e->getMessage()); } } protected function configureRouter(): void { $this->router->respond(['GET', 'POST'], '@(?!/api\.php)', $this->manageWebRequest()); } private function manageWebRequest(): Closure { return function (Request $request, Response $response) { try { logger('WEB route'); $route = Filter::getString($request->param('r', 'index/index')); $routeContextData = RouteContext::getRouteContextData($route); $controllerClass = self::getClassFor( $routeContextData->getController(), $routeContextData->getActionName() ); if (!method_exists($controllerClass, $routeContextData->getMethodName())) { logger($controllerClass . '::' . $routeContextData->getMethodName()); $response->code(404); throw new RuntimeException(self::OOPS_MESSAGE); } $this->context->setTrasientKey(self::CONTEXT_ACTION_NAME, $routeContextData->getActionName()); $this->setCors($response); $this->initializeCommon(); $this->module->initialize($controllerClass); logger( sprintf( 'Routing call: %s::%s::%s', $controllerClass, $routeContextData->getMethodName(), print_r($routeContextData->getMethodParams(), true) ) ); $controller = $this->createObjectFor($controllerClass); return call_user_func_array( [$controller, $routeContextData->getMethodName()], $routeContextData->getMethodParams() ); } catch (SessionTimeout) { logger('Session timeout'); } catch (Exception $e) { processException($e); echo __($e->getMessage()); if (DEBUG) { echo $e->getTraceAsString(); } } }; } }