Here is my main Slim app instantiation code:
$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' ] );
You can see that the last line is supposed to unset the errorHandler. Yet, in a controller for example I declare a function with:
public function index( $request, Response $response )
I forgot to set the 'Response' use statement, so it created an error (easily fixed but that's not the point). But this error was handled by slim. Why is that ? Isn't it supposed not to handle errors from the unset statement ?
UPDATE: error:
Details
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
Argument 2 passed to Rib\Src\Controllers\HomeController::index() must be an instance of Rib\Src\Controllers\Response, instance of Slim\Http\Response given
This is a namespace declaration error.Answer
In your controller file (HomeController
) at the top add this:
use \Psr\Http\Message\ResponseInterface as Response;
UPDATE
Sorry, I misread the question. So, you want to know why the error was handled by Slim.
This is because the error is a PHP Runtime error. And Slim has special handler for that. In container it is stored under the phpErrorHandler
key. By default it returns a 500
response code, and, of course, you can define your own error handler.
Therefore, to disable Slim's handling of PHP errors, unset $container['phpErrorHandler']
.
Important note: This handler is PHP7+ only, since PHP Error class was introduced in PHP7.0.
You can read more about subject here.
From the error output you posted it looks like that Slim did not handle the error and instead the default php error handler was used.
A Slim error output would look something like this:
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}