PHP Slim 在容器中获取路由占位符

PHP Slim Get route placeholder in a container

是否可以在 Slim 容器中获取路由占位符的值?我知道我可以通过向请求添加第三个参数来访问占位符,但我想注入它,所以我不会在每个请求上都分配它。

我试过 $app->getContainer('router') 但我似乎找不到真正提取占位符值的方法。

示例:

$app = new Slim\App;

$c = $app->getContainer();

$c['Controller'] = function() {
    $userId = // how do I get the route placeholder userId?
    return new Controller($userId);
};

$app->get('/user/{userId}','Controller:getUserId');

class Controller {
    public function __construct($userId) {
        $this->userId = $userId;
    }

    public function getUserId($request,$response) {
        return $response->withJson($this->userId);
    }
}

创建一个容器包装器和一个主控制器,然后从主控制器扩展所有控制器,然后您就可以访问容器。

我是这样解决这个问题的:

https://gist.github.com/boscho87/d5834ac1ba42aa3da02e905aa346ee30

如果没有一些 'hacky' 东西,这将无法工作,因为我们无法访问由 slim 构建的请求对象,而控制器正在构建。所以我建议您只使用第三个参数并从那里获取您的用户 ID。

'hacky' 的事情和执行时 slim 做的一样 $app->run(),但是如果你真的想这样做,你可以这样做:

$c['Controller'] = function($c) {
    $routeInfo = $c['router']->dispatch($c['request']);
    $args = $routeInfo[2];
    $userId = $args['userId'];
    return new Controller($userId);
};

注意:slim3 也对这些值进行了 url 解码,因此也可以这样做 urldecode($args['userId']) Source