1. 概述
让我们面对现实:有时出问题。拦截错误并适当地回应它们非常重要。Slim应用程序提供帮助方法来响应错误和异常。
重要笔记
Slim应用程序尊重您现有的error_reporting设置;
Slim应用程序仅处理Slim应用程序内生成的错误和异常;
Slim应用程序将错误转换为ErrorException对象并抛出它们;
如果Slim应用程序的debug设置为true,则使用其内置错误处理程序; 否则,它使用自定义错误处理程序。
2.500 System Error
您可以使用Slim应用程序的error()方法来指定在发生错误或异常时要调用的自定义错误处理程序。仅在禁用应用程序调试时才会调用自定义错误处理程序。
自定义错误处理程序应呈现用户友好的消息,以减轻用户的混淆。与Slim应用程序的notFound()方法类似,该error()方法既充当getter又充当setter。
设置定制错误处理程序
您可以通过将可调用函数error()作为其第一个也是唯一的参数传递给Slim应用程序的方法来设置自定义错误处理程序。
<?php
$app = new \Slim\Slim();
$app->error(function (\Exception $e) use ($app) {
$app->render('error.php');
});
在此示例中,自定义错误处理程序接受捕获的Exception作为其参数。这允许您适当地响应不同的异常。
调用自定义错误处理程序
通常,Slim应用程序将在发生异常或错误时自动调用错误处理程序。但是,您也可以使用Slim应用程序的error()方法手动调用错误处理程序(不带参数)。
3.404 Not Found
有人会要求不存在的页面是不可避免的。Slim应用程序允许您使用Slim应用程序的notFound()方法轻松定义自定义Not Found处理程序。当找不到当前HTTP请求的匹配路由时, 将调用Not Found处理程序。此方法充当getter和setter。
设置未找到处理程序
如果调用Slim应用程序的notFound()方法并将可调用对象指定为其第一个也是唯一的参数,则此方法将可调用对象注册为Not Found处理程序。但是,不会调用已注册的处理程序。
<?php
$app = new \Slim\Slim();
$app->notFound(function () use ($app) {
$app->render('404.html');
});
调用未找到的处理程序
如果在notFound()没有任何参数的情况下调用Slim应用程序的方法,则此方法将调用先前注册的Not Found处理程序。
<?php
$app = new \Slim\Slim();
$app->get('/hello/:name', function ($name) use ($app) {
if ( $name === 'Waldo' ) {
$app->notFound();
} else {
echo "Hello, $name";
}
});
4.Debug Mode
您可以使用以下设置在应用程序实例化期间启用调试:
<?php
$app = new \Slim\Slim(array(
'debug' => true
));
您还可以在运行时使用Slim应用程序的config()实例方法启用调试:
<?php
$app = new \Slim\Slim();
//Enable debugging (on by default)
$app->config('debug', true);
//Disable debugging
$app->config('debug', false);
如果启用了调试并发生异常或错误,则将显示诊断屏幕,其中包含错误说明,受影响的文件,文件行号和堆栈跟踪。如果禁用调试,则将调用自定义错误处理程序。
5. Output
Slim应用程序的环境将始终包含一个键slim.errors,其值为可写入的资源,可以写入日志和错误消息。每当捕获到异常或手动调用日志对象时,Slim应用程序的日志对象都会将日志消息写入slim.errors。
如果要将错误输出重定向到其他位置,可以通过修改Slim应用程序的环境设置来定义自己的可写资源。我建议您使用中间件来更新环境:
<?php
class CustomErrorMiddleware extends \Slim\Middleware
{
public function call()
{
// Set new error output
$env = $this->app->environment;
$env['slim.errors'] = fopen('/path/to/output', 'w');
// Call next middleware
$this->next->call();
}
}
请记住,slim.errors不必指向文件; 它可以指向任何有效的可写资源。