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
是否可以在 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