Slim Framework 4 with php 8.1 and IIS Server comunication

I have a problem with the operation of the website.

I installed slim framework v.4 I have php v.8.1 and the server IIS Slim 4 Documentation - Slim Framework I used this code to try if the project would start and unfortunately after many different attempts I was unable to start the website correctly.

I searched the forums but it still does not work. Has anyone encountered this problem before on the IIS server?

I believe that the cause may be this server and it will have to be configured accordingly, please advise.

I used url: http://localhost/TestSlim/index.php/. I am trying different paths without index.php : http://localhost/TestSlim/ or http://localhost/TestSlim/index.php/hello few times I reinstaled slim but without success. I am not sure how it works with IIS.

I used different methods I saw that problem isn’t exist for php 7.3.3 but higher like 8.1 is a problem with that

This is my index.php:

<?php use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; require __DIR__ . '/vendor/autoload.php'; //echo "test"; $app = AppFactory::create(); $app->addRoutingMiddleware(); $errorMiddleware = $app->addErrorMiddleware(true, true, true); $app->setBasePath('localhost/TestSlim'); echo $app->getBasePath(); $app->get('/', 'hello'); // Run app $app->run(); ?>

And I see the following error:

404 Not Found Type: Slim\Exception\HttpNotFoundException Code: 404 Message: Not found. File: C:\TestSlimFramework\vendor\slim\slim\Slim\Middleware\RoutingMiddleware.php Line: 91 Trace: #0 C:\TestSlimFramework\vendor\slim\slim\Slim\Middleware\RoutingMiddleware.php(58): Slim\Middleware\RoutingMiddleware->performRouting(Object(Slim\Psr7\Request)) #1 C:\TestSlimFramework\vendor\slim\slim\Slim\MiddlewareDispatcher.php(147): Slim\Middleware\RoutingMiddleware->process(Object(Slim\Psr7\Request), Object(Slim\Routing\RouteRunner)) #2 C:\TestSlimFramework\vendor\slim\slim\Slim\Middleware\ErrorMiddleware.php(107): Psr\Http\Server\RequestHandlerInterface@anonymous->handle(Object(Slim\Psr7\Request)) #3 C:\TestSlimFramework\vendor\slim\slim\Slim\MiddlewareDispatcher.php(147): Slim\Middleware\ErrorMiddleware->process(Object(Slim\Psr7\Request), Object(Psr\Http\Server\RequestHandlerInterface@anonymous)) #4 C:\TestSlimFramework\vendor\slim\slim\Slim\MiddlewareDispatcher.php(81): Psr\Http\Server\RequestHandlerInterface@anonymous->handle(Object(Slim\Psr7\Request)) #5 C:\TestSlimFramework\vendor\slim\slim\Slim\App.php(215): Slim\MiddlewareDispatcher->handle(Object(Slim\Psr7\Request)) #6 C:\TestSlimFramework\vendor\slim\slim\Slim\App.php(199): Slim\App->handle(Object(Slim\Psr7\Request)) #7 C:\TestSlimFramework\index.php(23): Slim\App->run() #8 {main}

I already deployed on IIS using Server->Sites->Default Web Site->Add Virtual Directory:

and added simple structure from directory

For IIS you need the Web.config file and index.php files are in the same public-accessible directory. The Web.config file should contain this code:

Hello I already did that:


this is code in config:

this is code index.php:

I retstarted IIS and still the same issue

This looks like a typical basePath issue. Is your site running in a sub-directory of the IIS document root?

Try to comment out this line or install the basePath middleware instead:

$app->setBasePath(‘TestSlimFramework’);

Remove this line because it causes response buffer issues:

echo $app->getBasePath();

The handler should be a valid. Change this line

$app->get(‘/’, ‘hello’);

to

$app->get('/', function (Request $request, Response $response) {
    $response->getBody()->write('Hello World');
    
    return $response;
});

Thank you for respond I made a change:


Still the same issue

$app->setBasePath(‘TestSlimFramework’);

The basePath, if any, should start with a “/”. I would try to commend out this line or use the basePath from your URI path. Otherwise try to install the BasePath middleware for auto-detection.

Yeah I founded solution I did:
$app->setBasePath(‘/TestSlim’); the same directory as on IIS
and Web.config:

<?xml version="1.0" encoding="UTF-8"?>

This is work for me. Thank you

I want to continue this issue because on the same configuration I was trying to use method DELETE and PUT. Not works form me only POST and GET.

$app->delete('api/hello/remove/{id}', function ($request, $response, $args) {
  $id = $args['id'];
  $response->getBody()->write("Item with ID $id has been deleted.");
  return $response->withStatus(200);
});

$app->put('api/hello/put/{id}', function ($request, $response, $args) {
  $id = $args['id'];
  $response->getBody()->write("Item with ID $id has been deleted.");
  return $response->withStatus(200);
});

I was trying to add some allows for DELETE and PUT in IIS configurations but nothing happened still the same issue. Full code below:

<?php 
    use Psr\Http\Message\ResponseInterface as Response;
    use Psr\Http\Message\ServerRequestInterface as Request;
    use Slim\Factory\AppFactory;
    use Slim\Middleware\MethodOverrideMiddleware;
    
    require __DIR__ . '/vendor/autoload.php';

  //echo "test";
    $app = AppFactory::create();
    $app->setBasePath('/TestSlim');
   
    $app->addBodyParsingMiddleware();
    $app->addRoutingMiddleware();
    $methodOverrideMiddleware = new MethodOverrideMiddleware();
$app->add($methodOverrideMiddleware);

    $errorMiddleware = $app->addErrorMiddleware(true, true, true);
    
    //$app->setBasePath('localhost/TestSlim');
    //echo $app->getBasePath();
    $app->get('/api/', function (Request $request, Response $response) {
      $response->getBody()->write("Welcome to Slim 4 on IIS!");
      return $response;
  });
  // Hello Route
  $app->get('/api/hello', function (Request $request, Response $response) {
      $response->getBody()->write("Hello, Slim!");
      return $response;
  });

  $app->post('/api/hello', function (Request $request, Response $response) {
    $response->getBody()->write("Hello, Slim!");
    return $response;
});
$app->add(function ($request, $handler) {
  return $handler->handle($request);
});

$app->delete('api/hello/remove/{id}', function ($request, $response, $args) {
  $id = $args['id'];
  $response->getBody()->write("Item with ID $id has been deleted.");
  return $response->withStatus(200);
});

$app->put('api/hello/put/{id}', function ($request, $response, $args) {
  $id = $args['id'];
  $response->getBody()->write("Item with ID $id has been deleted.");
  return $response->withStatus(200);
});

   
    
    // Run app
    $app->run();

?>

Try the RouteCollectorProxy