obter URL atual no modelo de galho?

169

Procurei o código para obter o caminho atual em um modelo Twig (e não a URL completa), ou seja, não quero http://www.sitename.com/page, só preciso /page.

Mark Cibor
fonte
11
NÃO é uma duplicata exata, pois a resposta 2 contém as informações necessárias (sobre parâmetros de solicitação) que a pergunta vinculada não fornece. Deve-se mesclar a resposta 2 na pergunta vinculada.
Victor Sergienko
1
tente app.request.requestUri.
Kristóf Dombi
7
Nem um idiota. Votação para reabrir. Postando minha resposta como um comentário, porque eu não estou autorizado a responder agora ... {{ app.request.getBaseUrl ~ app.request.getPathInfo }}( getBaseUrlbit é opcional; só precisava se não for instalado de raiz de domínio)
MPEN

Respostas:

250
{{ path(app.request.attributes.get('_route'),
     app.request.attributes.get('_route_params')) }}

Se você quiser lê-lo em uma variável de exibição:

{% set currentPath = path(app.request.attributes.get('_route'),
                       app.request.attributes.get('_route_params')) %}

A appvariável global view contém todos os tipos de atalhos úteis, como app.sessione app.security.token.user, que referenciam os serviços que você pode usar em um controlador.

Rodney Folz
fonte
9
infelizmente, isso não funcionará se você tiver uma rota com parâmetros obrigatórios.
Martin Schuhfuß
Se você estiver usando o Twig sem Symfony, poderá fazer algo assim: $ twig-> addGlobal ("CurrentUrl", $ _SERVER ["REQUEST_URI"]);
GateKiller #
1
Se sua rota tiver parâmetros obrigatórios, veja a resposta abaixo .
Sam
@GateKiller Isso fez minha Funcional Teste Fail:Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
Robin
Obrigado por uma resposta incrível, muito útil!
Vahe Shadunts
199

Obter URL atual : {{ app.request.uri }}no Symfony 2.3, 3, 4, 5


Obter apenas caminho : {{ app.request.pathinfo }}(sem parâmetros)


Obter solicitação uri : {{ app.request.requesturi }}(com parâmetros)

mrzmyr
fonte
1
Este é o único que funcionou para mim. Todos os outros perderam parâmetros de consulta que não faziam parte da rota ou dependiam do controlador e não do Twig.
Craig
13
Para obter o caminho, apenas tente {{ app.request.pathinfo }}ou veja uma lista dos métodos disponíveis em #/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
Michael
2
Essa deve ser a resposta correta. Curto e suave.
Fabian Picone #
2
uriobtém o URL com parâmetros. pathinfoobtém o caminho sem parâmetros. requestUriobtém o caminho COM parâmetros. requestUrideve ser adicionado a esta resposta IMO. Você raramente precisará do domínio e raramente removerá os parâmetros.
precisa saber é o seguinte
115

No symfony 2.1, você pode usar isto:

{{ path(app.request.attributes.get('_route'), 
        app.request.attributes.get('_route_params')) }}

No symfony 2.0, uma solução é escrever uma extensão ramificada para este

public function getFunctions()
{
    return array(
        'my_router_params' => new \Twig_Function_Method($this, 'routerParams'),
    );
}

/**
 * Emulating the symfony 2.1.x $request->attributes->get('_route_params') feature.
 * Code based on PagerfantaBundle's twig extension.
 */
public function routerParams()
{
    $router = $this->container->get('router');
    $request = $this->container->get('request');

    $routeName = $request->attributes->get('_route');
    $routeParams = $request->query->all();
    foreach ($router->getRouteCollection()->get($routeName)->compile()->getVariables() as $variable) {
        $routeParams[$variable] = $request->attributes->get($variable);
    }

    return $routeParams;
}

E use assim

{{ path(app.request.attributes.get('_route'), my_router_params()|merge({'additional': 'value'}) }}

Você não precisará de tudo isso, a menos que queira adicionar parâmetros adicionais aos seus links, como em um pager, ou queira alterar um dos parâmetros.

Bártfai Tamás
fonte
11
Se você deseja gerar o link atual no Twig e alterar o código do idioma para alternar idiomas, isso pode ser feito no Symfony 2.1 da seguinte forma: {{path (app.request.attributes.get ('_ route'), app.request.attributes .get ('_ route_params') | mesclar ({'_ locale': 'ja'}))}} Pode funcionar se você usar a extensão Twig de Bártfai Tamás
Naytzyrhc
Para sua implementação 2.0, recebo um erro dizendo que não há contêiner. Então eu adicionei a variável como é feita no PagerfantaBundle, mas depois diz que tenho que implementar o ContainerInterface?
Squazic 9/08/2012
Você precisa criar um construtor para esta extensão, que possui um parâmetro $ container. Em seguida, na configuração do DIC, você deve declarar o contêiner como um parâmetro para a extensão. Como aqui no TwigBundle
Bártfai Tamás
12
O _route_parameters não funcionará se você tiver alguns parâmetros adicionais na string de consulta. Você poderia usar app.request.query.all.
Wdev 26/11/2012
34

Você pode obter o URL atual no Twig assim:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}
Zaheer Babar
fonte
20

Deve-se observar que, se você tiver parâmetros de consulta adicionais no seu URL, que não fazem parte da rota configurada, a resposta aceita não os incluirá no URL atual (caminho).

Por que você deseja parâmetros extras?

Por exemplo, se você tiver uma página de lista com registros que podem ser filtrados por palavra-chave e a página tenha paginação, provavelmente as variáveis ​​de consulta para "palavra-chave" e "página" não estarão no seu caminho. Mas nos botões avançar e voltar da paginação, você precisa do URL atual completo (que contém as palavras-chave para que a próxima página ainda seja filtrada). E você precisa modificar a variável da página.

Como mesclar parâmetros de consulta extra

Assim, você pode obter a rota atual e mesclar as variáveis ​​extras (após modificar uma ou mais dessas variáveis ​​extras). Observe que você está mesclando suas próprias variáveis ​​em app.request.query.alle, em seguida, mesclando essa matriz no app.request.attributes.get('_route_params'). O path()método requer que você forneça todos os parâmetros necessários da rota, e é por isso que você precisa incluir o _route_params.

{{ path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')|merge(app.request.query.all|merge({'page': 2 }))) }}

Isso é realmente feio, mas se você estiver desenvolvendo paginação, precisará modificar a variável da página em cada link separado, para incluir a coisa toda a cada vez. Talvez outros tenham uma solução melhor.

Chadwick Meyer
fonte
2
Provavelmente deve ser{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
FDisk
2

Se você estiver usando o Silex 2, não poderá mais acessar o objeto Request.

Você pode acessar os atributos de solicitação atuais dessa maneira.

app.request_stack.currentrequest.attributes.get('_route')

E para gerar o URL atual completo: path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))

Tim
fonte
Você pode obter a URL atual em Twig / Silex 2 assim: global.request.attributes.get('_route'). Ponte Twig é necessária.
dsoms