我正在从 Slim/3 迁移到 Slim/4。我已经找到或想出了我正在使用的所有功能的替代品,这些功能已被删除,除了404 Not Found Handler(现在已经消失的一部分App::$settings):
Slim
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);
};
};
Run Code Online (Sandbox Code Playgroud)
Nim*_*ima 10
每个 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();
Run Code Online (Sandbox Code Playgroud)
另一种方法是创建一个通用错误处理程序并将其注册为默认处理程序,在该处理程序中,根据抛出的异常类型决定应该发送什么响应。就像是:
$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);
//Notice: Undefined variable for the $message
return $response->withStatus($code);
};
Run Code Online (Sandbox Code Playgroud)
然后您可以将其设置为默认错误处理程序:
$errorMiddleware = $app->addErrorMiddleware(true, true, true);
$errorMiddleware->setDefaultErrorHandler($customErrorHandler);
Run Code Online (Sandbox Code Playgroud)