【问题标题】:PHP Slim Get route placeholder in a containerPHP Slim 在容器中获取路由占位符
【发布时间】:2017-03-01 04:21:02
【问题描述】:

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

【问题讨论】:

    标签: php slim


    【解决方案1】:

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

    'hacky' 的事情是做同样的事情,当你执行 $app->run() 时 slim 会做什么,但如果你真的想这样做,你会去:

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

    注意:slim3 也对这个值进行了 urldecode,所以也可以这样做 urldecode($args['userId']) Source

    【讨论】:

    • 它确实有效,但你是对的。这很hacky。如果我要实现它,我可能会创建一个全局容器来返回一个函数来处理它。
    • @rob 你试过我的解决方案了吗......它也有点 hacky(我认为没那么多),但更通用,拥有一个主控制器也是一件好事,你有访问每个控制器中的容器
    • @SimonMüller 我看了看,对于我所追求的东西来说似乎有点矫枉过正。 jmattheis 提供的答案确实解决了我的问题,但让我思考容器是否真的应该承担这个责任。
    【解决方案2】:

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

    这是我解决这个问题的方法:

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

    【讨论】:

    • Pimple(DI 框架)自动添加容器作为构造函数参数,当没有其他定义时,所以不需要。
    • 但是您必须在每个控制器中再次编写 sam 代码 .... 只是为了访问容器,而在主控制器中您可以使用其他东西,例如记录器 .... 等。
    • 不,和你的主控制器一样,不同的是没有CurrentController类,容器会通过构造函数传入
    • 如何从 MainController 扩展控制器,当 MainController 需要构造函数参数时,每个控制器都有相同的参数
    • 当你没有在'你的控制器'中定义构造函数时,父构造函数将被执行,否则你需要做parent::__construct(..)
    猜你喜欢
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 2016-03-23
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多