Slim 4.11应用报错:Callable Quiz\Controller\QuizController::index()不存在
Slim 4应用报错:Callable Quiz\Controller\QuizController::index() 不存在
错误信息
( ! ) Fatal error: Uncaught RuntimeException: Callable Quiz\Controller\QuizController::index() does not exist in /var/www/html/vendor/slim/slim/Slim/CallableResolver.php on line 138 ( ! ) RuntimeException: Callable Quiz\Controller\QuizController::index() does not exist in /var/www/html/vendor/slim/slim/Slim/CallableResolver.php on line 138
环境与配置
- PHP版本:8.1
- Slim版本:4.11
- 自动加载规则(composer.json):
"autoload": { "psr-4": {"Quiz\\": "source/"} }
- 项目结构说明:控制器文件位于
source/Trivia/Controller/QuizController.php
控制器代码
<?php declare(strict_types=1); namespace Quiz\Trivia\Controller; use Psr\Container\ContainerInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Slim\Http\Response; final class QuizController { private $container; public function __construct(ContainerInterface $container) { $this->container = $container; } public function index(ServerRequestInterface $request, Response $response, array $args): ResponseInterface { return $this->container->get('views')->render( $response, 'index.twig' ); } }
路由配置(routes.php)
<?php declare(strict_types=1); use Quiz\Trivia\Controller\QuizController; return [ 'index' => [ 'type' => 'get', 'path' => '/', 'class' => QuizController::class . ':index' ] ];
当前操作
已通过$app->map(...)在index.php中加载路由配置,尝试过社区旧方案但未解决,需要定位问题并修复。
解决步骤
1. 定位核心问题
错误提示寻找Quiz\Controller\QuizController::index(),但实际控制器的完整命名空间是Quiz\Trivia\Controller\QuizController,两者不匹配。这说明路由解析时可能错误拼接了命名空间,或者路由注册逻辑存在问题。
2. 刷新自动加载
先执行composer命令确保自动加载规则生效:
composer dump-autoload
3. 修正路由注册逻辑
确保路由中使用完整正确的控制器命名空间:
- 如果是直接注册路由,改用标准写法:
// index.php中注册路由的示例 use Quiz\Trivia\Controller\QuizController; $app->get('/', [QuizController::class, 'index']);
- 如果是遍历routes.php的配置加载,检查遍历代码是否错误修改了
class字段的值,确保最终传递给$app->map()的Callable是Quiz\Trivia\Controller\QuizController:index。
4. 验证依赖容器配置
如果使用依赖容器管理控制器实例,确保容器能正确解析该控制器:
// 容器配置示例(如container.php) $container->set(Quiz\Trivia\Controller\QuizController::class, function ($container) { return new Quiz\Trivia\Controller\QuizController($container); });
内容的提问来源于stack exchange,提问作者curry
相关产品推荐
相关产品推荐

