. namespace core\router; use core\exception\invalid_parameter_exception; use core\exception\response_aware_exception; use core\router; use core\router\response\exception_response; use core\router\response\invalid_parameter_response; use core\router\schema\response\response_type; use Psr\Container\ContainerInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; /** * Controller Invoker for the Moodle Router. * * This class handles invocation of the route callable, and the conversion of the response into an appropriate format. * * @package core * @copyright Andrew Lyons * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class response_handler { /** * Create a new response handler. * * @param ContainerInterface $container */ public function __construct( /** @var ContainerInterface */ private readonly ContainerInterface $container, ) { } /** * Invoke a route callable. * * Note: Much of this is copied from the parent class, but we need to handle the response differently. * * @param ResponseInterface|response_type $response The response object. * @return ResponseInterface The response from the callable. */ public function standardise_response( ResponseInterface | response_type $response, ): ResponseInterface { if ($response instanceof ResponseInterface) { // An object implementing ResponseInterface is returned, so we can just return it. return $response; } $responsefactory = $this->container->get(router::class)->get_response_factory(); // This must be a response\response_type. return $response->get_response($responsefactory); } /** * Get the response from an exception. * * @param ServerRequestInterface $request * @param \Exception $exception * * @return ResponseInterface */ public function get_response_from_exception( ServerRequestInterface $request, \Exception $exception, ): ResponseInterface { $response = match (true) { // Newer exceptions may be response-aware, so we can use the response class they specify. (is_a($exception, response_aware_exception::class)) => $exception->get_response_classname()::get_response( $request, $exception, ), // Some legacy expressions are here for the moment. is_a($exception, invalid_parameter_exception::class) => invalid_parameter_response::get_response( $request, $exception, ), // Otherwise use the default. default => exception_response::get_response($request, $exception), }; return $this->standardise_response($response); } }