Как получить текущий маршрут в Symfony 2?
как мне получить текущий маршрут в Symfony 2?
например, routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
как я могу получить этот somePage
значение?
12 ответов:
от чего-то, что ContainerAware (как контроллер):
$request = $this->container->get('request'); $routeName = $request->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('');
Если вам не нужны гибкость это намного медленнее, чем использование 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, это то, что я использую
<?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 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 и чем вызов get ('_route').
public function indexAction(Request $request) { $routeName = $request->get('_route'); }
Если вы хотите получить название маршрута в ветке, чем вы должны получить его как
{{ app.request.attributes.get('_route') }}