如何获得当前的路线在Symfony 2?

如何获得Symfony 2中的当前路由?

例如,routing.yml:

somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }

如何获得这个somePage值?

218315 次浏览

来自ContainerAware(比如控制器):

$request = $this->container->get('request');
$routeName = $request->get('_route');

我从中得到的是 _internal < / p > 我从控制器$this->getRequest()->get('_route').中获得路由名 甚至代码tuxedo25也建议返回_internal

这段代码是在Symfony 1.X中所谓的“组件”中执行的;不是页面的控制器,而是页面的一部分,需要一些逻辑。

Symfony 1中的等效代码。X是:sfContext::getInstance()->getRouting()->getCurrentRouteName();

With Twig: \{\{ app.request.attributes.get('_route') }}

< p > Symfony 2.0 - -2.1 < br > 使用:< / p >
    $router = $this->get("router");
$route = $router->match($this->getRequest()->getPathInfo());
var_dump($route['_route']);

那个函数会给你_internal

Symfony 2.2+更新:这是不工作的Symfony 2.2+启动。我打开了一个错误,答案是“通过设计”。如果希望在子操作中获取路由,则必须将其作为参数传入

\{\{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }}

你的控制器:

public function menuAction($route) { ... }

我认为这是最简单的方法:

class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}


.....
$request->attributes->get('_route');

您可以从控制器内的请求对象中获取路由名称。

不存在适用于所有用例的解决方案。如果你使用$request->get('_route')方法或其变体,它会返回'_internal'用于发生转发的情况。

如果你需要一个即使转发也能工作的解决方案,你必须使用新的RequestStack服务,它在2.4中出现,但是这将打破ESI支持:

$requestStack = $container->get('request_stack');
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI
if ($masterRequest) {
echo $masterRequest->attributes->get('_route');
}

如果你在模板中需要它,你可以用它来做一个树枝扩展。

如果你想在你的控制器中获取路由名,那么你必须注入请求(而不是从容器中获取,因为Symfony升级,然后调用get('_route')。

public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}

如果你想在twig中获取路由名,你必须像这样

\{\{ app.request.attributes.get('_route') }}

_route不是要走的路,从来都不是它总是用于调试目的根据创建Symfony的Fabien。它是不可靠的,因为它不能用于转发和其他对控制器的直接调用,如部分呈现。

您需要在控制器点击这里查看医生中注入路由名作为参数

另外,如果你不需要灵活性,请永远不要使用$request->get('');,它比你需要的特定属性包(属性,查询或请求)上使用get慢得多,所以在这种情况下使用$request->attributes->get('_route');

要根据URL获取当前路由(在转发的情况下更可靠):

public function getCurrentRoute(Request $request)
{
$pathInfo    = $request->getPathInfo();
$routeParams = $this->router->match($pathInfo);
$routeName   = $routeParams['_route'];
if (substr($routeName, 0, 1) === '_') {
return;
}
unset($routeParams['_route']);


$data = [
'name'   => $routeName,
'params' => $routeParams,
];


return $data;
}

对于任何需要Symfony 3当前路由的人,这是我使用的

<?php
$request = $this->container->get('router.request_context');
//Assuming you are on user registration page like https://www.yoursite.com/user/registration
$scheme = $request->getScheme(); //This will return https
$host = $request->getHost(); // This will return www.yoursite.com
$route = $request->getPathInfo(); // This will return user/registration(don't forget this is registrationAction in userController
$name = $request->get('_route'); // This will return the name.
?>

在Symfony 3.3中,我使用了这种方法,并且运行良好。

我有4条路线

admin_category_index, admin_category_detail, admin_category_create, admin_category_update < / p >

只有一行为所有路由创建了一个活动类。

<li  {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}>
<a href="\{\{ path('admin_category_index') }}">Product Categoires</a>
</li>

使用Symfony 4.2.7,我能够在我的树枝模板中实现以下内容,它显示了我在控制器中定义的自定义路由名。

在index.html.twig

<div class="col">
{% set current_path =  app.request.get('_route') %}
\{\{ current_path }}
</div>

在控制器中


...


class ArticleController extends AbstractController {
/**
* @Route("/", name="article_list")
* @Method({"GET"})
*/
public function index() {
...
}


...
}

结果将“article_list”打印到浏览器中的所需页面。