2013-03-27 17 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'];