Slim+PHP-DI容器路由报错:调用bool类型的get()方法
问题分析与修复方案
核心问题本质
你碰到的「调用bool类型的get()方法」致命错误,根源是routes.php第20行调用$container->get()时,容器返回了false而非预期的服务实例。这种情况一般是服务注册失败、依赖初始化出错,或者容器本身未正确配置导致的。
具体排查修复步骤
1. 定位routes.php第20行的问题代码
先找到第20行的代码,大概率是类似这样的写法:
$controller = $container->get(HotelBaseController::class);
- 确认类名的命名空间、大小写完全正确,拼写错误会导致容器找不到服务,进而返回异常值。
- 如果这里是直接调用某个变量的
get()方法(比如$something->get()),那要确认$something是不是被错误赋值成了布尔值。
2. 检查dependencies.php的服务注册逻辑
重点看HotelBaseController对应的服务定义,比如:
$container->set(HotelBaseController::class, function ($c) { // 这里的逻辑如果返回false,就会导致后续调用出错 $dbConn = $c->get(PDO::class); if (!$dbConn) { return false; // 错误:应该抛出异常或修复依赖问题,而非返回bool } return new HotelBaseController($dbConn); });
- 确保服务定义的闭包最终返回的是类实例,绝对不能返回布尔值/空值。
- 检查该服务依赖的其他服务(比如数据库连接)是否能正常初始化,前置依赖失败会导致当前服务返回异常值。
3. 验证Slim与PHP-DI的集成正确性
确认index.php里的容器初始化逻辑正确,必须把PHP-DI容器传递给Slim应用:
use DI\Container; use Slim\Factory\AppFactory; require __DIR__ . '/vendor/autoload.php'; // 初始化PHP-DI容器 $container = new Container(); // 加载依赖配置 require __DIR__ . '/dependencies.php'; // 关键:将容器绑定到Slim AppFactory::setContainer($container); $app = AppFactory::create(); // 加载路由 require __DIR__ . '/routes.php'; // 开启错误中间件,方便调试 $app->addErrorMiddleware(true, true, true); $app->run();
如果容器没有正确绑定到Slim,路由里获取的容器可能不是PHP-DI实例,导致get()行为异常。
4. 调试输出快速定位
在routes.php第20行之前添加调试代码,直接查看服务获取结果:
$targetService = $container->get(HotelBaseController::class); var_dump($targetService); exit;
如果输出是bool(false),直接去dependencies.php里排查该服务的初始化逻辑,找到返回false的分支并修复(比如替换成抛出异常,或者修复依赖的问题)。
内容的提问来源于stack exchange,提问作者Mauro Ghiglia
相关产品推荐
相关产品推荐

