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

时间:2017-02-28 18:42:10

标签: php slim

是否可以在Slim容器中获取路径占位符的值?我知道我可以通过在请求中添加第三个参数来访问占位符,但我希望将其注入,这样我就不会在每个请求中分配它。

我已尝试过$ app-> getContainer('路由器')但我似乎无法找到实际提取占位符值的方法。

示例:

$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);
    }
}

2 个答案:

答案 0 :(得分:3)

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

'hacky'的东西会相同,当你执行$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

答案 1 :(得分:1)

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

这是我如何解决这个问题:

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