首页 > 解决方案 > Slim v4,addErrorMiddleware 似乎没有做任何事情

问题描述

所以我刚开始使用苗条的 PHP 框架,我有点困惑。如文档中所述: https ://www.slimframework.com/docs/v4/middleware/error-handling.html#adding-custom-error-handlers

这应该添加某种错误处理。

所以我测试了那个代码:

<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
use Psr\Log\LoggerInterface;

require __DIR__ . '/vendor/autoload.php';

$app = AppFactory::create();

// Add Routing Middleware
$app->addRoutingMiddleware();

// Define Custom Error Handler
$customErrorHandler = function (
    Request $request,
    Throwable $exception,
    bool $displayErrorDetails,
    bool $logErrors,
    bool $logErrorDetails,
    ?LoggerInterface $logger = null
) use ($app) {
    $logger->error($exception->getMessage());

    $payload = ['error' => $exception->getMessage()];

    $response = $app->getResponseFactory()->createResponse();
    $response->getBody()->write(
        json_encode($payload, JSON_UNESCAPED_UNICODE)
    );

    return $response;
};

// Add Error Middleware
$errorMiddleware = $app->addErrorMiddleware(true, true, true);
$errorMiddleware->setDefaultErrorHandler($customErrorHandler);


$app->get('/', function (Request $request, Response $response, $args) {
    $test = [];
    $foo = $test['nada'];
    $response->getBody()->write("Hello world!");
    return $response;
});

$app->run();

现在,当我调用未定义的路线时,例如

localhost:8000/this/route/doenst/exist

或者只是让一些错误的代码运行(从数组访问未定义的键)

localhost:8000/

我只是得到“普通”错误

对于未定义的路线: 未定义路由

对于编码错误: 编码错误

所以我想我的问题是:如何实现一个错误处理程序来处理编码错误或调用未定义的路由?

标签: phperror-handlingslimslim-4

解决方案


ErrorMiddleware处理任何类型的ExceptionThrowable

您可以通过抛出异常来测试 ErrorMiddleware,如下所示:

throw new \RuntimeException('Test error message');

此外Throwable,PHP 有其较旧的警告、通知和错误错误级别系统。

Undefined index in index.php line 42只是一个 PHP 通知。

Slim ErrorMiddleware 不处理这种类型的 PHP 错误。

要“捕获”这种类型的 PHP 错误,您可以使用该set_error_handler函数添加自定义错误处理程序。

阅读更多


推荐阅读