Замена для установки notFoundHandler
Я перехожу с Slim/3 на Slim/4. Я нашел или нашел замены для всех функций, которые я использовал, которые были удалены, кроме 404 Not Found Handler (часть уже ушедшего App::$settings
):
Стройное
App::$settings
были удалены несколько промежуточных программ, чтобы заменить функциональность каждого отдельного параметра.
Есть ли промежуточное ПО для notFoundHandler
? Если нет, как я могу это реализовать?
Мой раньше выглядел так:
use Slim\Container;
$config = new Container();
$config['notFoundHandler'] = function (Container $c) {
return function (Request $request, Response $response) use ($c): Response {
$page = new Alvaro\Pages\Error($c);
return $page->notFound404($request, $response);
};
};
1 ответ
Согласно Slim 4 документация по обработке ошибок
Каждое приложение Slim Framework имеет обработчик ошибок, который получает все необработанные исключения PHP
Вы можете установить собственный обработчик ошибок для обработки каждого типа создаваемых исключений. Список предопределенных классов исключений доступен на той же странице.
Вот очень простой пример того, как зарегистрировать замыкание как обработчик ошибок, для обработки только HttpNotFoundException
исключения. Вы также можете поместить обработчик в класс, который расширяет Slim\Handlers\ErrorHandler
, Кроме того, я на самом деле не использовал ваш Alvaro\Pages\Error
чтобы сгенерировать ответ, но его изменение должно быть прямым:
<?php
require '../vendor/autoload.php';
$app = Slim\Factory\AppFactory::create();
// Define Custom Error Handler
$customErrorHandler = function (
Psr\Http\Message\ServerRequestInterface $request,
\Throwable $exception,
bool $displayErrorDetails,
bool $logErrors,
bool $logErrorDetails
) use ($app) {
$response = $app->getResponseFactory()->createResponse();
// seems the followin can be replaced by your custom response
// $page = new Alvaro\Pages\Error($c);
// return $page->notFound404($request, $response);
$response->getBody()->write('not found');
return $response->withStatus(404);
};
// Add Error Middleware
$errorMiddleware = $app->addErrorMiddleware(true, true, true);
// Register the handler to handle only HttpNotFoundException
// Changing the first parameter registers the error handler for other types of exceptions
$errorMiddleware->setErrorHandler(Slim\Exception\HttpNotFoundException::class, $customErrorHandler);
$app->get('/', function ($request, $response) {
$response->getBody()->write('Hello Slim 4');
return $response;
});
$app->run();
Другой подход - создать общий обработчик ошибок и зарегистрировать его в качестве обработчика по умолчанию, а внутри этого обработчика решить, какой ответ следует отправить, основываясь на типе создаваемого исключения. Что-то вроде:
$customErrorHandler = function (
Psr\Http\Message\ServerRequestInterface $request,
\Throwable $exception,
bool $displayErrorDetails,
bool $logErrors,
bool $logErrorDetails
) use ($app) {
$response = $app->getResponseFactory()->createResponse();
if ($exception instanceof HttpNotFoundException) {
$message = 'not found';
$code = 404;
} elseif ($exception instanceof HttpMethodNotAllowedException) {
$message = 'not allowed';
$code = 403
}
// ...other status codes, messages, or generally other responses for other types of exceptions
$response->getBody()->write($message);
return $response->withStatus($code);
};
Затем вы можете установить это как обработчик ошибок по умолчанию:
$errorMiddleware = $app->addErrorMiddleware(true, true, true);
$errorMiddleware->setDefaultErrorHandler($customErrorHandler);