使用Slim框架出现Callable不存在的RuntimeException问题求助
解决Slim 4中Callable不存在的错误
问题分析
报错Callable TestController::showBlank() does not exist的核心原因有两个:
TestController类未被Composer自动加载,框架找不到这个类- Slim 4默认容器不支持自动解析带构造函数依赖的控制器(你的
TestController依赖ContainerInterface)
解决方案
步骤1:确保控制器被自动加载
当前你的TestController.php在项目根目录,Composer默认不会自动加载根目录下的类,需要修改composer.json添加自动加载规则:
修改后的composer.json:
{ "require": { "slim/slim": "^4.11", "slim/psr7": "^1.6", "slim/twig-view": "^3.3", "slim/http": "^1.3" }, "autoload": { "classmap": ["TestController.php"] } }
执行命令更新自动加载缓存:
composer dump-autoload
步骤2:处理控制器的依赖注入(二选一)
方案A:配置PHP-DI容器支持依赖注入
Slim 4推荐使用PHP-DI作为依赖容器,先安装依赖:
composer require php-di/php-di
修改index.php,替换默认容器:
<?php use Slim\Factory\AppFactory; use DI\Container; require './vendor/autoload.php'; // 初始化PHP-DI容器 $container = new Container(); AppFactory::setContainer($container); $app = AppFactory::create(); $app->get('/', [TestController::class, 'showBlank']); $app->run();
方案B:简化控制器,去掉容器依赖
如果不需要在控制器中使用容器,可以直接移除构造函数:
修改后的TestController.php:
<?php use Psr\Http\Message\ServerRequestInterface; use Slim\Http\Interfaces\ResponseInterface; class TestController { public function showBlank(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface { // 可选:添加响应内容,验证是否正常运行 $response->getBody()->write('Hello Slim!'); return $response; } }
验证
完成上述修改后,重新访问根路径/,应该能正常返回响应(如果用了方案B,会看到"Hello Slim!")。
内容的提问来源于stack exchange,提问作者Purus
相关产品推荐
相关产品推荐

