2017-02-28 18 views
0

是否有可能在Slim容器中獲取路由佔位符的值?我知道我可以通過向請求添加第三個參數來訪問佔位符,但我希望將它注入,以便我不在每個請求上分配它。PHP 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

如果沒有一些「哈克」的東西,這將無法工作,因爲我們已經通過纖細的請求對象構建用不上,而控制器得到構建。所以我建議你只使用第三個參數並從那裏獲取你的用戶名。

的「哈克」的事情是待辦事項一樣,什麼纖薄當你執行$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'])Source

+0

它確實有效,但你是正確的。這很不好意思。如果我要實現它,我可能會創建一個全局容器來返回一個函數來處理這個問題。 – Rob

+0

@rob您是否嘗試過我的解決方案......它也有點怪異(在我看來沒有那麼多),但是更通用一些,並且擁有主控制器也是一件好事,您可以訪問每個控制器中的容器 –

+0

@SimonMüller我看着它,看起來有點矯枉過正。 jmattheis提供的答案確實解決了我的問題,但讓我想到容器是否真的應該承擔這個責任。 – Rob

1

創建容器包裝和maincontroller然後從maincontroller延長所有的控制器,那麼你必須訪問容器。

這是我如何解決了這個問題:

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

+0

疙瘩(DI框架)自動添加容器作爲構造函數參數,當沒有其他定義時,所以沒有必要這樣做。 – jmattheis

+0

,但是你必須在每個控制器中再次寫入sam代碼....只需要訪問容器,並且在主控制器中可以使用其他東西,比如記錄器....等 –

+0

不,就像你的主控制器一樣,不同之處在於沒有CurrentController類,並且容器將通過構造函數 – jmattheis