依赖项中的细微错误无法找到控制器

I'm getting Slim Application Error:

Class 'Slim\App\Controllers\MainController' not found

This seems to be the same as others posts except, they don't have the 'Slim' in front. I think that's why it is failing.

project structure

/src
    /Controllers
        MainController.php
    /vendor
    /public
        index.php

composer.json

{
"require": {
    "slim/slim": "^3.12"
},

"autoload": {
    "psr-4" : {
        "App\\" : "src/"
    }
}

}

index.php

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

require '../vendor/autoload.php';

$configuration = [
    'settings' => [
    'displayErrorDetails' => true,
],
];
$c = new \Slim\Container($configuration);
$app = new \Slim\App($c);

require_once('../settings.php');
require_once('../dependencies.php');
require_once('../routes.php');

$app->run();

dependencies.php

use Slim\App;
use Slim\Container;
use App\Controllers;

$container = $app->getContainer();

$container['MainController'] = function ($c)
{
    return new App\Controllers\MainController;
};

/src/Controllers/MainController.php

namespace App\Controllers;
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

class MainController
{
public function search(Request $request, Response $response, $args)
{
    $response->write("Hello");

    return $response;
}
}

Always use the full class name for the container id.

Example

use App\Controllers\MainController;
// ...

$container[MainController::class] = function ($c)
{
    return new MainController();
}

In dependencies.php you've written use App\Controllers; and App\Controllers is a namespace not a class name. You need to name a class when using use keyword, like what you did in use Slim\App; or use \Psr\Http\Message\ServerRequestInterface as Request;.

Here is a modified version of your code that works as expected:

index.php

<?php
require __DIR__ . '/../vendor/autoload.php';

use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
use Slim\App;
use Slim\Container;
use App\Controllers\MainController;

$app = new \Slim\App;
$container = $app->getContainer();

$container['MainController'] = function ($c)
{
    return new MainController;
};

$app->get('/', 'MainController');

$app->run();

src/Controllers/MainContrloller.php

<?php
namespace App\Controllers;
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

class MainController
{
    public function __invoke(Request $request, Response $response, $args)
    {
        $response->write("Hello");

        return $response;
    }
}