Problems with monolog and slim 4

I am installing Monolog in Slim 4, but it is not working correctly and throws errors. Here is the trace:

Uncaught TypeError: {closure:/home/e24/www/test.com/orders/index.php:228}():
Argument #1 ($request) must be of type ServerRequestInterface, 
Slim\Psr7\Request given, called in /home/e24/www/test.com/orders/slim/slim/slim/Slim/Middleware/ErrorMiddleware.php 
on line 92 and defined in /home/e24/www/test.com/orders/index.php:235

Stack trace:

#0 /home/e24/www/test.com/orders/slim/slim/slim/Slim/Middleware/ErrorMiddleware.php(92): {closure:/home/e24/www/test.com/orders/index.php:228}()
#1 /home/e24/www/test.com/orders/slim/slim/slim/Slim/Middleware/ErrorMiddleware.php(79): Slim\Middleware\ErrorMiddleware->handleException()
#2 /home/e24/www/test.com/orders/slim/slim/slim/Slim/MiddlewareDispatcher.php(129): Slim\Middleware\ErrorMiddleware->process()
#3 /home/e24/www/test.com/orders/slim/slim/slim/Slim/MiddlewareDispatcher.php(73): Psr\Http\Server\RequestHandlerInterface@anonymous->handle()
#4 /home/e24/www/test.com/orders/slim/slim/slim/Slim/App.php(209): Slim\MiddlewareDispatcher->handle()
#5 /home/e24/www/test.com/orders/slim/slim/slim/Slim/App.php(193): Slim\App->handle()
#6 /home/e24/www/test.com/orders/index.php(2207): Slim\App->run()
#7 {main} thrown in /home/e24/www/test.com/orders/index.php on line 235

Code in slim 4:


//Optional: Define custom error logger
$logger = new Logger('error');
$logger -> pushHandler(new RotatingFileHandler('error.log'));

//Define Custom Error Handler
$custom_error_handler = function (
	ServerRequestInterface $request,
	Throwable $exception,
	bool $display_error_details,
	bool $log_errors,
	bool $log_error_details
)
use ($app, $logger) {
	if ($logger) {
		$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
$error_middleware = $app -> addErrorMiddleware(true, true, true, $logger);
$error_middleware -> setDefaultErrorHandler($custom_error_handler);

I want to create my own 404 error handling.

Did you add the using statement like this on top of your index.php file?
Maybe this is just missing:

use Psr\Http\Message\ServerRequestInterface;

Well yes

Not sure what is going on without seeing the full file. I would try this working example. Please give feedback if it works.

<?php

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

use Monolog\Handler\RotatingFileHandler;
use Monolog\Logger;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Slim\Exception\HttpNotFoundException;
use Slim\Factory\AppFactory;

$app = AppFactory::create();

$logger = new Logger('error');
$logger->pushHandler(new RotatingFileHandler('error.log'));

// Custom Error Handler
$custom_error_handler = function (
    ServerRequestInterface $request,
    Throwable $exception,
    bool $display_error_details,
    bool $log_errors,
    bool $log_error_details
) use ($app, $logger) {
    if ($logger) {
        $logger->error($exception->getMessage());
    }

    $statusCode = $exception instanceof HttpNotFoundException ? 404 : 500;
    $payload = ['error' => $exception->getMessage(), 'code' => $statusCode];

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

    return $response->withHeader('Content-Type', 'application/json');
};


$app->addRoutingMiddleware();

$errorMiddleware = $app->addErrorMiddleware(true, true, true, $logger);
$errorMiddleware->setDefaultErrorHandler($custom_error_handler);

$app->get('/', function (ServerRequestInterface $request, ResponseInterface $response) {
    throw new \RuntimeException('test message');
});

$app->run();

Your define the ServerRequestInterface as Request

Goofy guess:

Maybe change from

$custom_error_handler = function (
	ServerRequestInterface $request,

to

$custom_error_handler = function (
	Request $request,

Or rather consider removing the as Request in your use statement maybe it can conflict with the Request object.

Fun fact Slim\Psr7\Request does implement the ServerRequestInterface so this TypeError is really weird, no ?