Тонкая ошибка в зависимостях не может найти контроллер - PullRequest
0 голосов
/ 09 июля 2019

Я получаю Slim Application Error:

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

Это похоже на то, что и другие посты, за исключением того, что у них нет «Slim» спереди.Я думаю, именно поэтому он терпит неудачу.

структура проекта

/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;
}
}

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

В dependencies.php вы написали use App\Controllers;, а App\Controllers - это пространство имен, а не имя класса.При использовании ключевого слова use необходимо указать имя класса, например, как в use Slim\App; или use \Psr\Http\Message\ServerRequestInterface as Request;.

. Вот модифицированная версия вашего кода, которая работает, как и ожидалось:

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;
    }
}
0 голосов
/ 09 июля 2019

Всегда используйте полное имя класса для идентификатора контейнера.

Пример

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

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