Core
Controller Resolver Lifecycle
How controller creation uses container + request-scoped binding + context initialization.
Dispatch flow
Resolver binds current request, resolves controller via container, calls setControllerContext(), resolves action parameters and invokes action.
$this->container->set(ServerRequestInterface::class, $request);
$controller = $this->container->get($controllerClass);
$controller->setControllerContext($request, $responseFactory, $streamFactory);
DI guideline
Constructor injection is for business services. Action params are route params and optional ServerRequestInterface.