Як отримати поточний маршрут у 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');
З гілочкою: {{ app.request.attributes.get('_route') }}
<body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">
для застосування CSS-файлу для сторінки :)
Я думаю, що це найпростіший спосіб зробити це:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
{% render "SomeBundle:SomeController:someAction" %}
підзапросами на зразок , де ви знову отримаєте значення '_internal'.
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) { ... }
$route['_route']
здається проблематичним, але це може бути не симфонічним розмовом про розробку. Куховарська книга не згадує про _route
про $router->match()
вихід ..
$router->match()
говорить "масив @return Масив параметрів", який здається дуже внутрішнім. Я не хочу на це покладатися, але зараз, здається, це єдине життєздатне рішення при роботі з підзапросами.
Не існує рішення, яке б працювало для всіх випадків використання. Якщо ви використовуєте метод $ 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();
$view['request']->getParameter('_route');
{% render... %}
дзвінки разом із standalone=true
. Якщо увімкнено кешування (AppCache.php або лак з ESI), це призведе до запиту автономних представлень окремим HTTP-запитом (саме тут _internal
трапляється маршрут ), щоб ro було самостійно кешоване.
З 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 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 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 UPGRADE і ніж отримати виклик ('_ route').
public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}
якщо ви хочете отримати ім'я маршруту в гілочку, ніж вам доведеться його отримати
{{ app.request.attributes.get('_route') }}
$request->get()
безпосередньо, оскільки це повільно: github.com/symfony/http-foundation/blob/2.8/Request.php#L712