Files
moodle/lib/classes/router/error_handler.php
T
Andrew Nicols 968183714d MDL-82565 core: Improve routed Error handling
In previous versions of Moodle we recommended use of the fallback
resource with /error/index.php.

This is incompatible with the routing system because they use the same
mechanism for responding to any unknown request.

To better handle this we need to move the current error handler page to
a routed page, and to provide a shim for the old location.

At the same time we need to improve the Slim Error handling middleware
to respond with our 404 handler for all 404s, except for those on API
routes where we always respond with JSON.
2025-03-26 21:20:59 +08:00

59 lines
1.9 KiB
PHP

<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core\router;
use Psr\Http\Message\ServerRequestInterface;
use Slim\App;
use Slim\Handlers\ErrorHandler;
/**
* An Eerror Handler implementation for Moodle which is aware of the REST API.
*
* @package core
* @copyright Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class error_handler extends ErrorHandler {
/**
* Construct a new Error Handler.
*
* @param \Slim\App $app
*/
public function __construct(
App $app,
) {
parent::__construct(
$app->getCallableResolver(),
$app->getResponseFactory(),
);
$this->registerErrorRenderer('text/html', error_renderer::class);
}
#[\Override]
protected function determineContentType(ServerRequestInterface $request): ?string {
// For anything hitting /rest/api/v2 we will default to JSON.
$restbase = (new \core\url('/rest/api/v2/'))->get_path();
if (substr($request->getUri()->getPath(), 0, strlen($restbase)) === $restbase) {
return 'application/json';
}
// Fall back to the default behaviour of using the Accept header.
return parent::determineContentType($request);
}
}