Можно ли получить значение заполнителя маршрута в контейнере 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);
}
}
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'])
Источник
Создайте оболочку контейнера и главный контроллер, затем расширите весь свой контроллер от основного контроллера, и тогда у вас будет доступ к контейнеру.
Вот как я решил эту проблему:
https://gist.github.com/boscho87/d5834ac1ba42aa3da02e905aa346ee30
Похожие вопросы
Новые вопросы
php
PHP — это открытый, мультипарадигмальный, динамически типизированный и интерпретируемый язык сценариев, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.