Класс не найден с композитором psr4 - PullRequest
0 голосов
/ 10 июля 2019

Я использую композитор для загрузки простого класса контроллера, но я столкнулся с проблемой с автозагрузчиком. Это всегда даст мне эту ошибку: Fatal error: Uncaught Error: Class 'Controller' not found.

Мой файл composer.json выглядит так:

{
    "require": {
        "nikic/fast-route": "^1.3"
    },
    "autoload": {
      "psr-4": {
        "Controllers\\": "src/Controllers/"
      }
    }
}

и в моем корне проекта у меня есть папка src с подпапкой Controllers внутри.

Мне требуется автозагрузка и использование пространства имен Controllers внутри моего класса. В индексе, куда я загружаю контроллер с помощью маршрутизатора быстрого маршрута, после автозагрузчика у меня есть оператор use \Controllers\Controller;.

Что не так с моей реализацией?

вот полный код:

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

use Controllers\Controller;

$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $router) {

    $router->addRoute('GET', '/', 'Controller/index');
    $router->addRoute('GET', '/azienda', 'Controller/about');
    $router->addRoute('GET', '/servizi', 'Controller/services');
    $router->addRoute('GET', '/contatti', 'Controller/contacts');

});

// Fetch method and URI from somewhere
$httpMethod = $_SERVER['REQUEST_METHOD'];
$uri = $_SERVER['REQUEST_URI'];

// Strip query string (?foo=bar) and decode URI
if(false !== $pos = strpos($uri, '?')){
    $uri = substr($uri, 0, $pos);
}
$uri = rawurldecode($uri);

$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
switch ($routeInfo[0]) {
    case FastRoute\Dispatcher::NOT_FOUND:
        // ... 404 Not Found
        break;
    case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
        $allowedMethods = $routeInfo[1];
        // ... 405 Method Not Allowed
        break;
    case FastRoute\Dispatcher::FOUND:
        $handler = $routeInfo[1];
        $vars = $routeInfo[2];
        list($class, $method) = explode("/", $handler, 2);
        call_user_func_array([new $class, $method], $vars);
        break;
}

1 Ответ

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

Когда вы используете переменные в качестве имени класса (например, new $class), они должны содержать полное имя.В вашем случае $class содержит Controller, а FQN этого класса - Controllers\Controller.

Необходимо использовать полное имя (имя класса с префиксом пространства имен).Обратите внимание, что поскольку нет разницы между полным и полным именем внутри динамического имени класса, имени функции или имени константы, начальная обратная косая черта не требуется.

https://www.php.net/manual/en/language.namespaces.dynamic.php

Вам необходимо указать FQN в конфигурации диспетчера:

$router->addRoute('GET', '/', 'Controllers\Controller::index');
$router->addRoute('GET', '/azienda', 'Controllers\Controller::about');
$router->addRoute('GET', '/servizi', 'Controllers\Controller::services');
$router->addRoute('GET', '/contatti', 'Controllers\Controller::contacts');

И обработать результаты отправки следующим образом:

case FastRoute\Dispatcher::FOUND:
    $handler = $routeInfo[1];
    $vars = $routeInfo[2];
    list($class, $method) = explode('::', $handler, 2);
    call_user_func_array([new $class, $method], $vars);
    break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...