You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Slim框架控制器方法中无法访问$this的问题求助

解决Slim框架中「Using $this when not in object context」的问题

嘿,我一眼就看出问题出在哪了——你路由里的写法不对,导致Slim根本没实例化你的控制器对象,直接把index当静态方法调用了,那$this肯定找不到上下文啊!

问题到底出在哪

你现在的路由是这么写的:

$this->get('', '\App\Controllers\PMsController::index');

这里的::是PHP里静态调用的语法,Slim看到这个会直接尝试静态执行index方法,但你的index是实例方法,依赖控制器对象的上下文,所以就炸了。

改个写法就搞定

要让Slim自动帮你实例化控制器、注入容器,你得把双冒号换成单冒号:,告诉Slim先创建控制器对象,再调用实例方法:

$this->get('', '\App\Controllers\PMsController:index');

更稳妥的写法是用::class获取类名,减少字符串拼写错误:

$this->get('', \App\Controllers\PMsController::class . ':index');

额外检查点(以防万一)

改完路由后,你还可以确认这几点:

  • 你的BaseController和PMsController命名空间要和文件路径对应,Composer的自动加载能找到它们(比如App/Controllers/PMsController.php对应namespace App\Controllers;)。
  • 如果你没自定义容器,Slim默认的容器已经实现了Interop\Container\ContainerInterface,所以构造函数的注入是没问题的。
  • 再跑一遍请求试试,这时候Slim会自动实例化PMsController,把容器注入基类的构造函数,$this->container就能正常访问了。

要是你想手动控制控制器的实例化(比如加一些自定义依赖),也可以在容器里注册一下:

$container[\App\Controllers\PMsController::class] = function ($c) {
    return new \App\Controllers\PMsController($c);
};

不过这步不是必须的,Slim默认就能处理构造函数依赖容器的类。

内容的提问来源于stack exchange,提问作者Rohit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:26:52