dapatkan url saat ini di templat ranting?

169

Saya mencari-cari kode untuk mendapatkan jalur saat ini dalam template ranting (dan bukan URL lengkap), yaitu saya tidak mau http://www.sitename.com/page, saya hanya perlu /page.

Mark Cibor
sumber
11
Ini BUKAN duplikat yang tepat, karena jawaban # 2 berisi informasi yang diperlukan (tentang parameter permintaan) yang tidak disediakan oleh pertanyaan yang ditautkan. Seseorang harus menggabungkan jawaban # 2 ke dalam pertanyaan terkait.
Victor Sergienko
1
coba app.request.requestUri.
Kristóf Dombi
7
Sama sekali tidak menipu. Voting untuk dibuka kembali. Memposting jawaban saya sebagai komentar karena saya tidak diizinkan untuk menjawab sekarang ... {{ app.request.getBaseUrl ~ app.request.getPathInfo }}( getBaseUrlbit bersifat opsional; hanya diperlukan jika tidak diinstal ke root domain)
mpen

Jawaban:

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

Jika Anda ingin membacanya menjadi variabel tampilan:

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

The appvariabel pandangan global berisi segala macam cara pintas berguna, seperti app.sessiondan app.security.token.user, yang referensi layanan yang mungkin Anda gunakan di controller.

Rodney Folz
sumber
9
Sayangnya, ini tidak akan berfungsi jika Anda memiliki rute dengan parameter wajib.
Martin Schuhfuß
Jika Anda menggunakan Twig tanpa Symfony, Anda dapat melakukan sesuatu seperti ini: $ twig-> addGlobal ("CurrentUrl", $ _SERVER ["REQUEST_URI"]);
GateKiller
1
Jika rute Anda memiliki parameter wajib, lihat jawaban di bawah .
Sam
@GateKiller Ini membuat Gagal Tes Fungsional saya:Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
Robin
Terima kasih atas jawaban yang luar biasa, sangat membantu!
Vahe Shadunts
199

Dapatkan url saat ini : {{ app.request.uri }}di Symfony 2.3, 3, 4, 5


Dapatkan jalur saja : {{ app.request.pathinfo }}(tanpa parameter)


Dapatkan permintaan uri : {{ app.request.requesturi }}(dengan parameter)

mrzmyr
sumber
1
Ini adalah satu-satunya yang bekerja untuk saya. Semua yang lain melewatkan parameter kueri yang bukan bagian dari rute, atau mengandalkan pengontrol dan bukannya Twig.
Craig
13
Untuk mendapatkan jalur hanya mencoba {{ app.request.pathinfo }}atau melihat daftar metode yang tersedia di/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
Michael
2
Ini seharusnya jawaban yang benar. Pendek dan halus.
Fabian Picone
2
urimendapatkan URL dengan parameter. pathinfomendapat jalur dengan parameter NO . requestUrimendapat path DENGAN parameter. requestUriharus ditambahkan ke jawaban ini IMO. Anda jarang membutuhkan domain, dan Anda jarang ingin menghapus parameter.
rybo111
115

Dalam symfony 2.1 Anda dapat menggunakan ini:

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

Dalam symfony 2.0, satu solusi adalah menulis ekstensi ranting untuk ini

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

Dan gunakan seperti ini

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

Anda tidak akan memerlukan semua ini kecuali Anda ingin menambahkan parameter tambahan ke tautan Anda, seperti di pager, atau Anda ingin mengubah salah satu parameter.

Bártfai Tamás
sumber
11
Jika Anda ingin membuat tautan saat ini di Ranting dan mengubah lokal untuk alih bahasa, itu dapat dilakukan di Symfony 2.1 sebagai berikut: {{path (app.request.attributes.get ('_ route'), app.request.attributes .get ('_ route_params') | merge ({'_ locale': 'ja'}))}} Ini dapat bekerja jika Anda menggunakan ekstensi Twig oleh Bártfai Tamás
Naytzyrhc
Untuk implementasi 2.0 Anda, saya mendapatkan pesan kesalahan yang mengatakan bahwa tidak ada wadah. Jadi saya menambahkan variabel seperti yang dilakukan di PagerfantaBundle, tetapi kemudian dikatakan saya harus mengimplementasikan ContainerInterface?
Squazic
Anda harus membuat konstruktor untuk ekstensi ini, yang memiliki parameter $ container. Kemudian dalam konfigurasi DIC Anda harus mendeklarasikan wadah sebagai parameter untuk ekstensi. Seperti di sini di TwigBundle
Bártfai Tamás
12
_Route_parameters tidak akan berfungsi jika Anda memiliki beberapa params tambahan di string kueri Anda. Anda bisa menggunakan app.request.query.all sebagai gantinya.
wdev
34

Anda bisa mendapatkan URL saat ini di Twig seperti ini:

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

Perlu dicatat bahwa jika Anda memiliki parameter kueri tambahan di URL Anda, yang bukan bagian dari rute yang dikonfigurasi, jawaban yang diterima tidak akan memasukkannya ke dalam URL saat ini (jalur).

Mengapa Anda ingin parameter tambahan?

Misalnya, jika Anda memiliki halaman daftar dengan catatan yang dapat difilter berdasarkan kata kunci dan halaman memiliki pagination, kemungkinan besar variabel kueri untuk "kata kunci" dan "halaman" tidak akan berada di rute Anda. Tetapi dalam tombol maju dan mundur untuk paging, Anda memerlukan URL lengkap saat ini (yang berisi kata kunci sehingga halaman berikutnya masih difilter). Dan Anda perlu memodifikasi variabel halaman.

Cara Menggabungkan Parameter Kueri Ekstra

Jadi Anda bisa mendapatkan rute saat ini, dan menggabungkan variabel tambahan (setelah memodifikasi satu atau lebih dari variabel tambahan itu). Perhatikan bahwa Anda menggabungkan variabel Anda sendiri ke app.request.query.all, dan kemudian menggabungkan array itu ke dalam app.request.attributes.get('_route_params'). The path()metode mengharuskan Anda menyediakan semua parameter yang diperlukan dari rute, yang mengapa Anda perlu menyertakan _route_params.

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

Itu benar-benar jelek, tetapi jika Anda sedang mengembangkan pagination, Anda perlu memodifikasi variabel halaman pada setiap tautan yang terpisah, jadi Anda harus memasukkan semua itu setiap kali. Mungkin yang lain punya solusi yang lebih baik.

Chadwick Meyer
sumber
2
Mungkin seharusnya{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
FDisk
2

Jika Anda menggunakan Silex 2 Anda tidak dapat mengakses objek Permintaan lagi.

Anda dapat mengakses atribut permintaan saat ini dengan cara ini.

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

Dan untuk menghasilkan URL lengkap saat ini: path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))

Tim
sumber
Anda bisa mendapatkan URL saat ini di Ranting / Silex 2 seperti ini: global.request.attributes.get('_route'). Jembatan ranting diperlukan.
dsoms