Как получить текущий маршрут в Symfony 2?
Например, routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Как я могу получить это значение somePage
?
Как получить текущий маршрут в Symfony 2?
Например, routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Как я могу получить это значение somePage
?
Из чего-то, что является ContainerAware (например, контроллер):
$request = $this->container->get('request');
$routeName = $request->get('_route');
С Twig: {{ app.request.attributes.get('_route') }}
Я думаю, что это самый простой способ сделать это:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
Symfony 2.0-2.1
Используйте это:
$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) { ... }
Нет решения, которое работает для всех случаев использования. Если вы используете метод $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');
}
Вы можете сделать расширение ветки из этого, если вам это нужно в шаблонах.
_route
- это не путь и никогда не был. Он всегда был предназначен для целей отладки в соответствии с Фабиеном, который создал Symfony. Это ненадежно, поскольку оно не будет работать с такими вещами, как переадресация и другие прямые вызовы контроллерам, такие как частичный рендеринг.
Вам нужно ввести название маршрута в качестве параметра в вашем контроллере, посмотреть здесь документ
Кроме того, никогда не используйте $request->get('');
, если вам не нужна гибкость, это медленнее, чем использование того, что вам нужно (атрибуты, запрос или запрос), поэтому $request->attributes->get('_route');
в этом случае.
$request->attributes->get('_route');
Вы можете получить имя маршрута из объекта запроса из контроллера.
Все, что я получаю от этого _internal
Я получаю имя маршрута внутри контроллера с помощью $this->getRequest()->get('_route').
Даже код tuxedo25 предложил вернуть _internal
Этот код выполняется в так называемом "компоненте" в Symfony 1.X; Не является страничным контроллером, а частью страницы, которая нуждается в некоторой логике.
Эквивалентный код в Symfony 1.X: sfContext::getInstance()->getRouting()->getCurrentRouteName();
С Symfony 3.3 я использовал этот метод и отлично работал.
У меня есть 4 маршрута, например
admin_category_index, admin_category_detail, admin_category_create, admin_category_update
И только одна строка делает активный класс для всех маршрутов.
<li {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}>
<a href="{{ path('admin_category_index') }}">Product Categoires</a>
</li>
Чтобы получить текущий маршрут на основе 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
?>
В 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" на нужную страницу в моем браузере.
если вы хотите получить имя маршрута в своем контроллере, вместо того, чтобы вводить запрос (вместо получения из контейнера из-за Symfony UPGRADE и чем вызов get ('_ route').
public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}
если вы хотите получить имя маршрута в ветке, чем вы должны получить его как
{{ app.request.attributes.get('_route') }}