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

SlimPHP路由组内获取容器报错求助:缺少Slim\App::get()参数2

解决SlimPHP路由组中获取容器时的"Missing argument 2"报错

嘿,刚接触SlimPHP遇到这个报错很正常,我来帮你捋清楚问题所在。

首先,这个报错PHP Warning: Missing argument 2 for Slim\App::get()的直接原因非常明确:你调用get()方法时少传了一个必填参数。Slim的get()(包括post()、put()等路由方法)必须接收两个参数:第一个是路由的URL路径,第二个是处理请求的闭包/回调函数,你大概率是漏写了第二个参数,或者写法不符合路由组的规范。

接下来我结合常见的错误场景和正确写法给你举例说明:

先看常见的错误写法(踩坑现场)

比如你可能在路由组里写成了这样:

$app->group('/api', function () use ($app) {
    // 错误:只传了路径,没传处理回调
    $this->get('/users');
    
    // 或者错误地把容器获取放在了参数位置,导致回调缺失
    $container = $app->getContainer();
    $this->get('/posts', $container->get('db'));
});

这两种写法都会触发那个报错,因为get()的第二个参数必须是能处理请求的回调函数,而不是直接传容器实例。

正确的路由组+容器使用方式

根据你用的Slim版本不同,写法略有差异,我分两种主流版本给你示例:

如果你用的是Slim 3(自带容器)

// 先定义容器服务(比如数据库连接)
$container = $app->getContainer();
$container['db'] = function ($c) {
    $dbConfig = $c['settings']['db'];
    return new PDO(
        "mysql:host={$dbConfig['host']};dbname={$dbConfig['dbname']}",
        $dbConfig['user'],
        $dbConfig['pass']
    );
};

// 正确的路由组写法
$app->group('/api', function () {
    // 方式1:在回调里用$this直接获取容器服务(Slim 3里$this指向容器)
    $this->get('/users', function ($request, $response, $args) {
        // 获取容器里的db服务
        $db = $this->get('db');
        // 这里写你的业务逻辑,比如查询数据库
        return $response->write('获取到用户列表');
    });

    // 方式2:提前获取容器,通过use注入到回调里
    $container = $this->getContainer();
    $this->get('/posts', function ($request, $response, $args) use ($container) {
        $db = $container->get('db');
        return $response->write('获取到文章列表');
    });
});

如果你用的是Slim 4(默认无容器,需第三方容器如PHP-DI)

use DI\Container;
use Slim\Factory\AppFactory;

// 初始化容器
$container = new Container();
AppFactory::setContainer($container);
$app = AppFactory::create();

// 注册容器服务
$container->set('db', function ($c) {
    $dbConfig = $c->get('settings')['db'];
    return new PDO(
        "mysql:host={$dbConfig['host']};dbname={$dbConfig['dbname']}",
        $dbConfig['user'],
        $dbConfig['pass']
    );
});

// 路由组写法
$app->group('/api', function (\Slim\Routing\RouteCollectorProxy $group) {
    $group->get('/users', function ($request, $response, $args) {
        // 通过request对象获取容器
        $db = $request->getContainer()->get('db');
        return $response->write('获取到用户列表');
    });
});

最后检查要点

  1. 确保每个路由方法(get()/post()等)都有两个参数:路径字符串 + 处理请求的闭包。
  2. 在回调内部通过正确的方式获取容器:Slim3用$this->get('服务名'),Slim4用$request->getContainer()->get('服务名')或者提前注入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:19:07