Como obtenho a rota atual no Symfony 2?
Por exemplo routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Como posso obter esse somePage
valor?
Como obtenho a rota atual no Symfony 2?
Por exemplo routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Como posso obter esse somePage
valor?
Respostas:
De algo que é ContainerAware (como um controlador):
$request = $this->container->get('request');
$routeName = $request->get('_route');
Com o Twig: {{ app.request.attributes.get('_route') }}
<body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">
para aplicar css específico da página :)
Eu acho que essa é a maneira mais fácil de fazer isso:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
{% render "SomeBundle:SomeController:someAction" %}
, onde você obterá o valor '_internal' novamente.
Symfony 2.0-2.1
Use isto:
$router = $this->get("router");
$route = $router->match($this->getRequest()->getPathInfo());
var_dump($route['_route']);
Aquele não vai te dar _internal
.
Atualização para o Symfony 2.2+: Isso não está funcionando ao iniciar o Symfony 2.2+. Abri um bug e a resposta foi "por design". Se você deseja obter a rota em uma sub-ação, deve transmiti-la como argumento
{{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }}
E seu controlador:
public function menuAction($route) { ... }
$route['_route']
parece problemático, mas pode não ser o que o symfony dev fala. O livro de receitas não menciona cerca _route
de $router->match()
saída ..
$router->match()
diz "@return array Uma matriz de parâmetros" que parece muito interna. Não quero confiar nisso, mas, no momento, parece ser a única solução viável ao lidar com sub-solicitações.
Não há solução que funcione para todos os casos de uso. Se você usar o método $ request-> get ('_ route') ou suas variantes, ele retornará '_internal' para os casos em que o encaminhamento ocorreu.
Se você precisar de uma solução que funcione mesmo com o encaminhamento, precisará usar o novo serviço RequestStack, que chegou na 2.4, mas isso interromperá o suporte ESI :
$requestStack = $container->get('request_stack');
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI
if ($masterRequest) {
echo $masterRequest->attributes->get('_route');
}
Você pode fazer uma extensão de galho, se precisar nos modelos.
_route
não é o caminho a percorrer e nunca foi . Sempre foi feito para fins de depuração, de acordo com Fabien, que criou o Symfony. Não é confiável, pois não funcionará com coisas como encaminhamento e outras chamadas diretas para controladores, como renderização parcial.
Você precisa injetar o nome da sua rota como parâmetro no seu controlador, consulte o documento aqui
Além disso, nunca use $request->get('');
se você não precisar da flexibilidade, pois é muito mais lento do que usar get no pacote de propriedades específico que você precisa (atributos, consulta ou solicitação), portanto $request->attributes->get('_route');
, neste caso.
$request->attributes->get('_route');
Você pode obter o nome da rota do objeto de solicitação de dentro do controlador.
Tudo o que estou obtendo disso é
_internal
Eu recebo o nome da rota de dentro de um controlador com $this->getRequest()->get('_route').
Até o código tuxedo25 sugerido retorna_internal
Esse código é executado no que foi chamado de 'Componente' no Symfony 1.X; Não é o controlador de uma página, mas parte de uma página que precisa de alguma lógica.
O código equivalente no Symfony 1.X é: sfContext::getInstance()->getRouting()->getCurrentRouteName();
$view['request']->getParameter('_route');
{% render... %}
chamadas com standalone=true
. Com o armazenamento em cache (AppCache.php ou verniz com ESI) ativado, isso fará com que as visualizações independentes sejam solicitadas com uma Solicitação HTTP separada (é aqui que a rota _internal
entra em ação) para que seja armazenada em cache independentemente.
Com o Symfony 3.3, eu usei esse método e funcionando bem.
Eu tenho 4 rotas como
admin_category_index, admin_category_detail, admin_category_create, admin_category_update
E apenas uma linha cria uma classe ativa para todas as rotas.
<li {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}>
<a href="{{ path('admin_category_index') }}">Product Categoires</a>
</li>
Para obter a rota atual com base no URL (mais confiável no caso de encaminhamentos):
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;
}
Com o Symfony 4.2.7, sou capaz de implementar o seguinte no meu modelo de galho, que exibe o nome da rota personalizada que defini no (s) meu (s) controlador (es).
Em index.html.twig
<div class="col">
{% set current_path = app.request.get('_route') %}
{{ current_path }}
</div>
No meu controlador
...
class ArticleController extends AbstractController {
/**
* @Route("/", name="article_list")
* @Method({"GET"})
*/
public function index() {
...
}
...
}
O resultado imprime "article_list" na página desejada no meu navegador.
Para quem precisa de rota atual para o Symfony 3, é isso que eu uso
<?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.
?>
se você deseja obter o nome da rota no seu controlador, precisa injetar a solicitação (em vez de sair do contêiner devido ao Symfony UPGRADE e chamar a função get ('_ route').
public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}
se você deseja obter o nome da rota em galho do que você precisa
{{ app.request.attributes.get('_route') }}
$request->get()
diretamente porque ele é lento: github.com/symfony/http-foundation/blob/2.8/Request.php#L712