* @copyright (c) 2025, Robert Strutts * @license MIT */ namespace CodeHydrater\http; use \CodeHydrater\http\service_provider as ServiceProvider; use \CodeHydrater\http\kernel as Kernel; use \CodeHydrater\http\request as Request; use \CodeHydrater\http\response as Response; use \CodeHydrater\router as Router; use \CodeHydrater\app as App; /** * Description of route_service_provider * Setup Router and Controllers * * @author Robert Strutts */ class route_service_provider extends ServiceProvider { protected Kernel $kernel; public function __construct(Kernel $kernel) { $this->kernel = $kernel; } private function build($handler, $response, $request, $next, $controller_middleware) { // Build middleware stack $middleware_stack = array_reduce( array_reverse($controller_middleware), function ($next, $middleware) { return function ($request, $response) use ($next, $middleware) { if ($middleware !== null ) { $instance = new $middleware(); return $instance($request, $response, $next); } }; }, function ($request, $response) use ($handler) { $response->set_content($handler->get_content()); return $response; } ); return $middleware_stack($request, $response); } public function register(): void { // Add router middleware $this->kernel->add_middleware(function (Request $request, Response $response, $next) { $returned_route = Router::execute($request, $response); if ($returned_route["found"] === false) { $app = new App($request, $response); $returned = $app->load_controller(); $a_middleware = $returned['middleware'] ?? []; $data = $returned['data'] ?? ""; return $this->build($data, $response, $request, $next, $a_middleware); } else { return $this->build($returned_route['returned'], $response, $request, $next, $returned_route['middleware']); } }); } }