即使设置为 Slim 仍会处理错误

Slim still handling errors even if set not to

这是我的主要 Slim 应用程序实例化代码:

$slimSettings = [
    'settings' => [
        'displayErrorDetails' => false,
        'routerCacheFile'     => false  # Settings::ABSPATH . '/tmp/route.cache'
    ],
];

# Initialize
$app = new \Slim\App( $slimSettings );

# Create container
$container = $app->getContainer();

# Register component on container
$container[ 'view' ] = function( $container ) {
    $renderer = new \Slim\Views\PhpRenderer();
    $renderer->setAttributes( [ 'absPath' => Settings::ABSPATH ] ); # Variable accessible from all templates

    return $renderer;
};

# Remove error handling from slim, so custom error handling is used.
unset( $app->getContainer()[ 'errorHandler' ] );

您可以看到最后一行应该取消设置 errorHandler。 然而,例如在控制器中我声明了一个函数:

public function index( $request, Response $response )

我忘记设置 'Response' use 语句,所以它产生了一个错误(很容易修复,但这不是重点)。但是这个错误被 slim 处理了。这是为什么 ?难道不应该不处理 unset 语句的错误吗?

更新:错误:

详情

Slim Application Error
The application could not run because of the following error:

Type: TypeError
Message: Argument 2 passed to Rib\Src\Controllers\HomeController::index() must be an instance of Rib\Src\Controllers\Response, instance of Slim\Http\Response given
File: /Users/ME/Documents/Apps_And_Sites/PHP_Apps/ribklein/src/Controllers/HomeController.php
Line: 19

从您发布的错误输出来看,Slim 似乎没有处理错误,而是使用了默认的 php 错误处理程序。

Slim 错误输出看起来像这样:

Slim Application Error

The application could not run because of the following error:
Details
Type: TypeError
Message: Argument 1 passed to Sleeti\Controllers\Authentication\a() must implement interface Psr\Http\Message\ServerRequestInterface, array given, called in C:\Source\Web\PHP\Apps\SlimPomf\src\Controllers\Authentication\AuthenticationController.php on line 62
File: C:\Source\Web\PHP\Apps\SlimPomf\src\Controllers\Authentication\AuthenticationController.php
Line: 58
Trace

#0 C:\Source\Web\PHP\Apps\SlimPomf\src\Controllers\Authentication\AuthenticationController.php(62): Sleeti\Controllers\Authentication\a(Array)
#1 [internal function]: Sleeti\Controllers\Authentication\AuthenticationController->postLogin(Object(Slim\Http\Request), Object(Slim\Http\Response), Array)
#2 C:\Source\Web\PHP\Apps\SlimPomf\vendor\slim\slim\Slim\Handlers\Strategies\RequestResponse.php(41): call_user_func(Array, Object(Slim\Http\Request), Object(Slim\Http\Response), Array)
#3 C:\Source\Web\PHP\Apps\SlimPomf\vendor\slim\slim\Slim\Route.php(340): Slim\Handlers\Strategies\RequestResponse->__invoke(Array, Object(Slim\Http\Request), Object(Slim\Http\Response), Array)
#4 C:\Source\Web\PHP\Apps\SlimPomf\src\Middleware\GuestMiddleware.php(27): Slim\Route->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response))
#5 [internal function]: Sleeti\Middleware\GuestMiddleware->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Slim\Route))
#6 C:\Source\Web\PHP\Apps\SlimPomf\vendor\slim\slim\Slim\DeferredCallable.php(43): call_user_func_array(Object(Sleeti\Middleware\GuestMiddleware), Array)
#7 [internal function]: Slim\DeferredCallable->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Slim\Route))
#8 C:\Source\Web\PHP\Apps\SlimPomf\vendor\slim\slim\Slim\MiddlewareAwareTrait.php(67): call_user_func(Object(Slim\DeferredCallable), Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Slim\Route))
#9 C:\Source\Web\PHP\Apps\SlimPomf\vendor\slim\slim\Slim\MiddlewareAwareTrait.php(116): Slim\Route->Slim\{closure}(Object(Slim\Http\Request), Object(Slim\Http\Response))
#10 C:\Source\Web\PHP\Apps\SlimPomf\vendor\slim\slim\Slim\Route.php(316): Slim\Route->callMiddlewareStack(Object(Slim\Http\Request), Object(Slim\Http\Response))
#11 C:\Source\Web\PHP\Apps\SlimPomf\vendor\slim\slim\Slim\App.php(438): Slim\Route->run(Object(Slim\Http\Request), Object(Slim\Http\Response))
#12 C:\Source\Web\PHP\Apps\SlimPomf\src\Middleware\LocalizationMiddleware.php(29): Slim\App->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response))
#13 [internal function]: Sleeti\Middleware\LocalizationMiddleware->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Slim\App))
#14 C:\Source\Web\PHP\Apps\SlimPomf\vendor\slim\slim\Slim\DeferredCallable.php(43): call_user_func_array(Object(Sleeti\Middleware\LocalizationMiddleware), Array)
#15 [internal function]: Slim\DeferredCallable->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Slim\App))
#16 C:\Source\Web\PHP\Apps\SlimPomf\vendor\slim\slim\Slim\MiddlewareAwareTrait.php(67): call_user_func(Object(Slim\DeferredCallable), Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Slim\App))
#17 C:\Source\Web\PHP\Apps\SlimPomf\src\Middleware\LoggerMiddleware.php(36): Slim\App->Slim\{closure}(Object(Slim\Http\Request), Object(Slim\Http\Response))
#18 [internal function]: Sleeti\Middleware\LoggerMiddleware->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Closure))
#19 C:\Source\Web\PHP\Apps\SlimPomf\vendor\slim\slim\Slim\DeferredCallable.php(43): call_user_func_array(Object(Sleeti\Middleware\LoggerMiddleware), Array)
#20 [internal function]: Slim\DeferredCallable->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Closure))
#21 C:\Source\Web\PHP\Apps\SlimPomf\vendor\slim\slim\Slim\MiddlewareAwareTrait.php(67): call_user_func(Object(Slim\DeferredCallable), Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Closure))
#22 C:\Source\Web\PHP\Apps\SlimPomf\vendor\slim\slim\Slim\MiddlewareAwareTrait.php(116): Slim\App->Slim\{closure}(Object(Slim\Http\Request), Object(Slim\Http\Response))
#23 C:\Source\Web\PHP\Apps\SlimPomf\vendor\slim\slim\Slim\App.php(332): Slim\App->callMiddlewareStack(Object(Slim\Http\Request), Object(Slim\Http\Response))
#24 C:\Source\Web\PHP\Apps\SlimPomf\vendor\slim\slim\Slim\App.php(293): Slim\App->process(Object(Slim\Http\Request), Object(Slim\Http\Response))
#25 C:\Source\Web\PHP\Apps\SlimPomf\public\index.php(5): Slim\App->run()
#26 {main}

Argument 2 passed to Rib\Src\Controllers\HomeController::index() must be an instance of Rib\Src\Controllers\Response, instance of Slim\Http\Response given

这是一个命名空间声明error.Answer

在您的控制器文件 (HomeController) 顶部添加:

use \Psr\Http\Message\ResponseInterface as Response;

更新

抱歉,我看错了问题。所以,你想知道为什么这个错误被 Slim 处理了。

这是因为错误是 PHP 运行时错误。 Slim 对此有特殊的处理程序。在容器中,它存储在 phpErrorHandler 键下。默认情况下,它 returns 一个 500 响应代码,当然,您可以定义自己的错误处理程序。

因此,要禁用 Slim 对 PHP 错误的处理,请取消设置 $container['phpErrorHandler']

重要说明: 此处理程序仅 PHP7+,因为 PHP Error class was introduced in PHP7.0.

您可以阅读有关主题 here 的更多信息。