我正在使用作曲器加载简单的控制器类,但是我遇到了自动加载器的问题。它总是会给我这个错误:
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;
}
答案 0 :(得分:0)
在将变量用作类名时(例如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;