tuupola / slim-api-skeleton

Slim 3 API skeleton project for Composer
MIT License
312 stars 62 forks source link

Uncaught TypeError: Argument 3 passed to Slim\\Handlers\\ApiError #27

Closed pdrappo closed 6 years ago

pdrappo commented 7 years ago

When some exceptions are throwed by Slim the ApiError handler can't handle it because the passed parameters are wrong.

Uncaught TypeError: Argument 3 passed to Slim\Handlers\ApiError::__invoke() must be an instance of Slim\Handlers\Exception, instance of UnexpectedValueException given in /home/ieasrl/intranet/src/Slim/Handlers/ApiError.php:19

For example if i upload the project to the server, create a virtualHost and i forgot to give 777 cmod permission to log folder this could happend.

I can't understand what is really wrong or if ApiError must work different. So i have to comment handlers to see the error in apache log.

Other error when handler.php is not commented is: [Thu Aug 10 10:16:44.159886 2017] [:error] [pid 14888] [client 10.0.2.247:51490] PHP Notice: Array to string conversion in /home/ieasrl/intranet/vendor/tuupola/dbal-psr3-logger/src/Psr3Logger.php on line 40

ganesh35 commented 7 years ago

Please help.

As long as no errors in the program everything works fine. But when there is an error it shows this message and not handling it properly.

Seems like the error handling is throwing errors. Need a quick fix.


Fatal error: Uncaught TypeError: Argument 3 passed to Slim\Handlers\ApiError::__invoke() must be an instance of Exception, instance of TypeError given in \src\Slim\Handlers\ApiError.php:37 Stack trace:

0 [internal function]: Slim\Handlers\ApiError->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response), Object(TypeError))

1 \vendor\slim\slim\Slim\App.php(671): call_user_func_array(Object(Slim\Handlers\ApiError), Array)

2 \vendor\slim\slim\Slim\App.php(374): Slim\App->handlePhpError(Object(TypeError), Object(Slim\Http\Request), Object(Slim\Http\Response))

3 \vendor\slim\slim\Slim\App.php(295): Slim\App->process(Object(Slim\Http\Request), Object(Slim\Http\Response))

4 \app.php(78): Slim\App->run()

5 \public\index.php(3): require('C:\xampp\htdocs...')

6 {main}

thrown in src\Slim\Handlers\ApiError.php on line 37

tuupola commented 7 years ago

@pdrappo are you running PHP 5 or 7? I try to reproduce this.

pdrappo commented 7 years ago

@tuupola Mike, i'm using PHP 7 on CLI mode when i'm developing.

ganesh35 commented 7 years ago

I am using PHP Version 7.1.1

sjozsef commented 7 years ago

The problem is that PHP \Error objects gets passed to \Slim\Handlers\ApiError::__invoke() method, wich is assuming \Exceptions instead of \Errors.

To reproduce that bug, try to create a todo with invalid json format:

curl "https://192.168.50.52/todos" --request POST --include --insecure --header "Authorization: Bearer $TOKEN" --header "Content-Type: application/json" --data "{ 'title': 'Test the API', 'order': 10 }"

Hotfix:

Comment out that lines in config/handlers.php:

$container["phpErrorHandler"] = function ($container) {
    return $container["errorHandler"];
};

If you pass an Accept: application/json header to your requests, you'll get simple json errors via the built-in Slim error handler.

If you want to handle PHP Errors as API Problems (like ApiError handler does), you have to implement a new error handler based on the built-in Slim PhpError class.

execthis commented 6 years ago

Quick fix for Php7 would be replacing \Exception with \Throwable for: https://github.com/tuupola/slim-api-skeleton/blob/f5231bc2472c678d9a6837f9275766ae415bc443/src/Slim/Handlers/ApiError.php#L37

See https://www.slimframework.com/docs/handlers/php-error.html for reference.

tuupola commented 6 years ago

Should be fixed with https://github.com/tuupola/slim-api-skeleton/commit/9f810e094cc428d0cb03c3d0628397b89f75a751.