2013-03-27 15 views
6
獲取路線名稱

好的,您可以使用app.request.attributes.get('_route')獲取當前的路線名稱,但是無法從網址獲取路線名稱?Symfony2從URL

類似app.request.attributes.get('/about')

回答

15

您可以使用Router類/服務這一點:

public function indexAction() 
{ 
    $router = $this->get('router'); 
    $route = $router->match('/foo')['_route']; 
} 

更多信息the documentation

+0

它的工作THX當匹配方法:=) – altore 2013-03-27 07:51:05

+0

我用這一點,但它是無效的。 Symfony中的Route服務具有當前請求的狀態。爲了獲得真正的路由,你應該設置使用HTTP方法創建的上下文,該方法可以是POST,PATCH或PUT或其他。 – 2017-04-04 06:35:14

7

我最近發現,match()方法使用當前請求的HTTP方法,以匹配請求。因此,例如,如果您正在執行PUT請求,它會嘗試將您提供的URL與PUT方法進行匹配,從而導致MethodNotAllowedException異常(例如,獲取引用者)。

爲了避免這種情況我使用這種解決方法:

// set context with GET method of the previous ajax call 
$context = $this->get('router')->getContext(); 
$currentMethod = $context->getMethod(); 
$context->setMethod('GET'); 

// match route 
$routeParams = $this->get('router')->match($routePath); 

// set back original http method 
$context->setMethod($currentMethod); 

但是也未必是真實的,它總是一個GET請求。它可能是您的情況下的POST請求。

我把這個問題發給了Symfony社區。讓我們看看他們的建議。

+0

你可以強制'HEAD'方法,而不是'GET'。如果您在緩存文件中檢查「appDevUrlMatcher.php」或「appProdUrlMatcher.php」,您將看到總是允許所有路由使用「HEAD」方法。有了這個,你將不再需要估計使用哪種方法來匹配引用者。 – Elorfin 2013-11-26 12:22:39

3

我得到了MethodNotAllowed即使使用絕對路徑 我工作圍繞它像這樣

$ref = str_replace("app_dev.php/", "", parse_url($request->headers->get('referer'),PHP_URL_PATH)); 
$route = $this->container->get('router')->match($ref)['_route'];