Можно ли получить значение заполнителя маршрута в контейнере 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);
    }
}
1
Rob 28 Фев 2017 в 21:42

2 ответа

Лучший ответ

Без некоторых «хакерских» вещей это не сработает, потому что у нас нет доступа к объекту запроса, скомпилированному slim, пока создается контроллер. Поэтому я рекомендую вам просто использовать третий параметр и получить ваш ID пользователя оттуда.

«Хакерская» вещь - это то же самое, что делает slim, когда вы выполняете $app->run(), но если вы действительно хотите сделать это, вот вам:

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

Примечание: slim3 также urldecoded это значение, поэтому может сделать это также urldecode($args['userId']) Источник

3
jmattheis 28 Фев 2017 в 20:21

Создайте оболочку контейнера и главный контроллер, затем расширите весь свой контроллер от основного контроллера, и тогда у вас будет доступ к контейнеру.

Вот как я решил эту проблему:

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

1
Simon Müller 28 Фев 2017 в 19:47