500 系统错误处理器

Edit This Page

出问题了!你并不能预知错误,但你可以预料到。每个 Slime 框架应用程序都有一个错误处理器用于接收所有未抓取的 PHP 异常。这个错误处理器同样能接收当前 HTTP 的请求对象和响应对象。这个错误处理器必须预备并返回一个适当的响应对象,这个对象会被返回到 HTTP 客户端。

默认的错误处理器

默认的错误处理器非常基础。它将响应状态编码设置为 500,并将响应内容类型设置为 text/html,并将一个通用的错误信息加入到响应体中。

这个对于生产应用_大概_不太合适。强烈建议你实现专用于你的 Slim 应用程序的错误处理器。

默认的错误处理程序还可以包括详细的错误诊断信息。要启用这个功能你需要将 displayErrorDetails 设置为 true :

$configuration = [
 "settings" => [
 "displayErrorDetails" => true,
 ],
];
$c = new SlimContainer($configuration);
$app = new SlimApp($c);

自定义错误处理器

Slim 框架应用程序的错误处理器是一种 Pimple 服务。你可以通过应用程序容器对自定义 Pimple factory 方法进行定义,来创建自定义的错误处理器取代默认的。

有两种注入处理器的方法:

Pre App

$c = new SlimContainer();
$c["errorHandler"] = function ($c) {
 return function ($request, $response, $exception) use ($c) {
 return $c["response"]->withStatus(500)
 ->withHeader("Content-Type", "text/html")
 ->write("Something went wrong!");
 };
};
$app = new SlimApp($c);

Post App

$app = new SlimApp();
$c = $app->getContainer();
$c["errorHandler"] = function ($c) {
 return function ($request, $response, $exception) use ($c) {
 return $c["response"]->withStatus(500)
 ->withHeader("Content-Type", "text/html")
 ->write("Something went wrong!");
 };
};

在这个例子中,我们定义了一个新的 errorHandler factory ,它将返回一个 callable 。返回的 callable 接收三个参数:

  1. 一个 PsrHttpMessageServerRequestInterface 实例
  2. 一个 PsrHttpMessageResponseInterface 实例
  3. 一个 Exception 实例

这个 callable 必须 返回一个新的 PsrHttpMessageResponseInterface 实例,对于给定的异常也是如此。

务必注意:下面这三个类型的异常不会被自定义的 errorHandler 处理:

  • SlimExceptionMethodNotAllowedException: 这个可以用自定义的 notAllowedHandler 来处理。
  • SlimExceptionNotFoundException: 这个可以用自定义的 notFoundHandler 来处理。
  • SlimExceptionSlimException: 这种类型的异常是 Slim 内置的,它的处理不能被覆写。

禁用

要想彻底地禁用 Slim 的错误处理器,只需从容器中移除错误处理器即可:

unset($app->getContainer()["errorHandler"]);

现在,你需要负责处理所有异常了,因为 Slim 已经不再处理它们。

文章导航