setApp($app); $this->setRunner(new Runner()); } /** * Run the request/response through the Application and its middleware. * * This will invoke the following methods: * * - App->bootstrap() - Perform any bootstrapping logic for your application here. * - App->middleware() - Attach any application middleware here. * - Trigger the 'Server.buildMiddleware' event. You can use this to modify the * from event listeners. * - Run the middleware queue including the application. * * @param \Psr\Http\Message\ServerRequestInterface $request The request to use or null. * @param \Psr\Http\Message\ResponseInterface $response The response to use or null. * @return \Psr\Http\Message\ResponseInterface * @throws \RuntimeException When the application does not make a response. */ public function run(ServerRequestInterface $request = null, ResponseInterface $response = null) { $this->app->bootstrap(); $request = $request ?: ServerRequestFactory::fromGlobals(); $response = $response ?: new Response(); $middleware = $this->app->middleware(new MiddlewareQueue()); if (!($middleware instanceof MiddlewareQueue)) { throw new RuntimeException('The application `middleware` method did not return a middleware queue.'); } $this->dispatchEvent('Server.buildMiddleware', ['middleware' => $middleware]); $middleware->add($this->app); $response = $this->runner->run($middleware, $request, $response); if (!($response instanceof ResponseInterface)) { throw new RuntimeException(sprintf( 'Application did not create a response. Got "%s" instead.', is_object($response) ? get_class($response) : $response )); } return $response; } /** * Emit the response using the PHP SAPI. * * @param \Psr\Http\Message\ResponseInterface $response The response to emit * @param \Zend\Diactoros\Response\EmitterInterface $emitter The emitter to use. * When null, a SAPI Stream Emitter will be used. * @return void */ public function emit(ResponseInterface $response, EmitterInterface $emitter = null) { if (!$emitter) { $emitter = new SapiStreamEmitter(); } $emitter->emit($response); } /** * Set the application. * * @param BaseApplication $app The application to set. * @return $this */ public function setApp(BaseApplication $app) { $this->app = $app; return $this; } /** * Get the current application. * * @return BaseApplication The application that will be run. */ public function getApp() { return $this->app; } /** * Set the runner * * @param \Cake\Http\Runner $runner The runner to use. * @return $this */ public function setRunner(Runner $runner) { $this->runner = $runner; return $this; } }