dal şablonunda mevcut url olsun?


169

Bir Twig şablonunda (ve tam URL değil) geçerli yolu almak için kod aradım, yani istemiyorum http://www.sitename.com/page, sadece ihtiyacım var /page.


11
Yanıt # 2, bağlantılı sorunun sağlamadığı gerekli bilgileri (istek parametreleri hakkında) içerdiğinden, bu tam bir kopya DEĞİLDİR. Cevap 2'yi bağlantılı soru ile birleştirmek gerekir.
Victor Sergienko

1
app.request.requestUri'yi deneyin.
Kristóf Dombi

7
Hiç bir dupe değil. Yeniden açmak için oylama. Cevabımı bir yorum olarak {{ app.request.getBaseUrl ~ app.request.getPathInfo }}getBaseUrl
gönderiyorum

Yanıtlar:


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

Bir görünüm değişkeninde okumak istiyorsanız:

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

Genel appgörünüm değişkeni, bir denetleyicide kullanabileceğiniz hizmetlere başvuran app.sessionve gibi her türlü yararlı kısayolu içerir app.security.token.user.


9
ne yazık ki, zorunlu parametreleri olan bir rotanız varsa bu çalışmaz.
Martin Schuhfuß

Symfony olmadan Twig kullanıyorsanız şu şekilde yapabilirsiniz: $ twig-> addGlobal ("CurrentUrl", $ _SERVER ["REQUEST_URI"]);
GateKiller

1
Rotanızda zorunlu parametreler varsa, aşağıdaki cevaba bakın .
Sam

@GateKiller Bu benim Fonksiyonel Test Başarısız yaptı:Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
Robin

İnanılmaz bir cevap için teşekkürler, çok yararlı!
Vahe Shadunts

199

Get geçerli url : {{ app.request.uri }}in Symfony'de 2.3, 3, 4, 5


Yalnızca yolu al : {{ app.request.pathinfo }}(parametresiz)


İstek alın uri : {{ app.request.requesturi }}(parametrelerle)


1
Benim için çalışan tek kişi bu. Tüm diğerleri rotanın bir parçası olmayan veya Twig yerine denetleyiciye dayanan sorgu parametrelerini kaçırdı.
Craig

13
Yolu almak için yalnızca şu {{ app.request.pathinfo }}yöntemlerin bir listesini deneyin veya görün/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
Michael

2
Bu doğru cevap olmalı. Kısa ve pürüzsüz.
Fabian Picone

2
uriURL'yi parametrelerle alır. NO parametresi pathinfoile yolu alır . parametresi İLE yolu alır . bu cevaba IMO eklenmelidir. Etki alanına nadiren ihtiyacınız olacak ve parametreleri nadiren kaldırmak isteyeceksiniz. requestUrirequestUri
rybo111

115

Symfony 2.1'de bunu kullanabilirsiniz:

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

Symfony 2.0'da bir çözüm bunun için bir dal uzantısı yazmaktır

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;
}

Ve böyle kullan

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

Bir çağrı cihazında olduğu gibi bağlantılarınıza ek parametreler eklemek istemiyorsanız veya parametrelerden birini değiştirmek istemiyorsanız, tüm bunlara ihtiyacınız olmayacaktır.


11
Twig'de geçerli bağlantıyı oluşturmak ve dil değiştirme için yerel ayarı değiştirmek istiyorsanız, Symfony 2.1'de şu şekilde yapılabilir: {{path (app.request.attributes.get ('_ route'), app.request.attributes .get ('_ route_params') | merge ({'_ locale': 'ja'}))}} Bártfai Tamás
Naytzyrhc

2.0 uygulamanız için kapsayıcı olmadığını belirten bir hata alıyorum. Bu yüzden PagerfantaBundle'da olduğu gibi değişkeni ekledim, ancak daha sonra ContainerInterface'i uygulamak zorunda olduğumu söylüyor?
Squazic

Bu kapsayıcı için $ container parametresine sahip bir yapıcı oluşturmanız gerekir. Daha sonra DIC konfigürasyonunda, kabı uzantı için bir parametre olarak bildirmeniz gerekir. Burada TwigBundle olduğu gibi
Bártfai Tamás

12
Sorgu dizenizde ek parametreler varsa _route_parameters çalışmaz. Bunun yerine app.request.query.all kullanabilirsiniz.
wdev

34

Mevcut URL'yi Twig'de şu şekilde alabilirsiniz:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}

20

URL'nizde yapılandırılmış rotanın bir parçası olmayan ek sorgu parametreleriniz varsa , kabul edilen yanıtın bunları geçerli URL'ye (yola) dahil etmeyeceğine dikkat edilmelidir .

Neden fazladan parametre istesin ki?

Örneğin, anahtar kelimeye göre filtrelenebilecek kayıtların bulunduğu bir liste sayfanız varsa ve sayfa sayfa numaralandırması varsa, büyük olasılıkla "anahtar kelime" ve "sayfa" için sorgu değişkenleri rotanızda olmayacaktır. Ancak, sayfalama için ileri ve geri düğmelerinizde, tam olarak geçerli URL'ye ihtiyacınız vardır (bir sonraki sayfanın yine de filtrelenmesi için anahtar kelimeleri içerir). Ve sayfa değişkenini değiştirmeniz gerekir.

Ekstra Sorgu Parametrelerinde Birleştirme

Böylece geçerli rotayı alabilir ve ekstra değişkenleri birleştirebilirsiniz (bu ekstra değişkenlerden birini veya daha fazlasını değiştirdikten sonra). Kendi değişkenlerinizde ile app.request.query.allbirleştirdiğinizi ve ardından bu diziyi ile birleştirdiğinizi unutmayın app.request.attributes.get('_route_params'). path()Yöntem dahil etmek ihtiyacımız var rota, tüm gerekli parametreleri sağlamak gerektirir _route_params.

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

Bu gerçekten çirkin, ancak sayfalandırma geliştiriyorsanız, her ayrı bağlantıdaki sayfa değişkenini değiştirmeniz gerekir, bu nedenle her seferinde her şeyi eklemeniz gerekir. Belki de başkalarının daha iyi bir çözümü vardır.


2
Muhtemelen olmalı{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
FDisk

2

Silex 2 kullanıyorsanız, Request nesnesine artık erişemezsiniz.

Mevcut istek özelliklerine bu şekilde erişebilirsiniz.

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

Mevcut URL'nin tamamını oluşturmak için: path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))


Sen Twig / böyle Silex'deki 2 mevcut URL alabilecek: global.request.attributes.get('_route'). Dal köprüsü gereklidir.
dsoms
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.