Bagaimana cara mendapatkan rute saat ini di Symfony 2?

224

Bagaimana saya mendapatkan rute saat ini di Symfony 2?

Sebagai contoh, routing.yml:

somePage:
   pattern: /page/
   defaults: { _controller: "AcmeBundle:Test:index" }

Bagaimana saya bisa mendapatkan somePagenilai ini ?

IlyaDoroshin
sumber

Jawaban:

323

Dari sesuatu yang ContainerAware (seperti pengontrol):

$request = $this->container->get('request');
$routeName = $request->get('_route');
tuxedo25
sumber
2
@ dapatkan switchwation untuk Anda memeriksa meta.stackexchange.com/questions/155258/…
NullPoiиteя
37
github.com/symfony/symfony/issues/854 request.attributes.get ('_ route') tidak dapat diandalkan karena hanya untuk tujuan debug (kata symfony dev) dan tidak berfungsi jika permintaan diteruskan ... lihat jawaban supernova yang didokumentasikan dan lebih aman-gagal
luiges90
3
Alasan untuk ini tidak berfungsi ketika sesuatu diteruskan adalah karena fakta bahwa Anda meneruskan langsung ke controller, bukan rute. Karena itu, Symfony tidak tahu untuk apa rute itu. Biasanya, Anda memiliki satu rute ke satu pengontrol, sehingga mungkin terasa aneh bahwa ini tidak dapat melaporkan apa pun selain "_internal", namun, dimungkinkan untuk membuat pengontrol tujuan umum yang dikaitkan dengan lebih dari satu definisi rute. Ketika Anda mempertimbangkan semua ini, saya pikir "gotcha" ini lebih masuk akal.
jzimmerman2011
@ tuxedo25 Pikirkan tentang menggunakan RequestStack: symfony.com/blog/new-in-symfony-2-4-the-request-stack
mYkon
2
$ request-> get ('_ route'); lambat ! $ request-> atribut-> get ('_ route'); lebih baik jika Anda tidak memerlukan fleksibilitas
Tom Tom
190

Dengan ranting: {{ app.request.attributes.get('_route') }}

Matthieu
sumber
8
Terima kasih! Saya menggunakan <body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">untuk menerapkan css khusus laman :)
Salman von Abbas
10
github.com/symfony/symfony/issues/854 request.attributes.get ('_ route') tidak dapat diandalkan karena hanya untuk tujuan debug (kata symfony dev) dan tidak berfungsi jika permintaan diteruskan ... lihat jawaban supernova yang didokumentasikan dan lebih aman-gagal
luiges90
48

Saya pikir ini adalah cara termudah untuk melakukan ini:

class MyController extends Controller
{
    public function myAction($_route)
    {
        var_dump($_route);
    }

    .....
supernova
sumber
3
Bisakah Anda menambahkan lebih banyak penjelasan atau menunjukkan contoh hasil untuk memperjelas bagaimana ini menyelesaikan masalah?
Charlie
1
@Charlie Ini adalah variabel yang telah ditentukan yang memberi Anda rute "nama" yang cocok
supernova
2
Ini jelas merupakan jawaban terbaik untuk pertanyaan awal. Sebagai catatan: tidak berfungsi, namun, dengan sub-permintaan seperti {% render "SomeBundle:SomeController:someAction" %}, di mana Anda akan mendapatkan nilai '_internal' lagi.
netmikey
2
Sangat disayangkan bahwa ini hanya berfungsi dalam Aksi asli, untuk fungsi lain yang harus diteruskan.
Darek Wędrychowski
27

Symfony 2.0-2.1
Gunakan ini:

    $router = $this->get("router");
    $route = $router->match($this->getRequest()->getPathInfo());
    var_dump($route['_route']);

Yang itu tidak akan memberimu _internal.

Pembaruan untuk Symfony 2.2+: Ini tidak berfungsi memulai Symfony 2.2+. Saya membuka bug dan jawabannya "sesuai desain". Jika Anda ingin mendapatkan rute dalam sub-aksi, Anda harus meneruskannya sebagai argumen

{{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }}

Dan pengontrol Anda:

public function menuAction($route) { ... }
jsgoupil
sumber
github.com/symfony/symfony/issues/854 Saya tidak yakin tentang hal ini, $route['_route']tampaknya bermasalah tetapi mungkin tidak membahas tentang symfony dev. Masak tidak menyebutkan tentang _routedari $router->match()output ..
luiges90
Saya sepenuhnya setuju dengan @ luiges90. PHPDoc dari $router->match()kata "@return array Sebuah array parameter" yang tampaknya sangat internal. Saya tidak ingin bergantung pada itu, tetapi saat ini, tampaknya menjadi satu-satunya solusi yang layak ketika berhadapan dengan sub-permintaan.
netmikey
19

Tidak ada solusi yang berfungsi untuk semua kasus penggunaan. Jika Anda menggunakan metode $ request-> get ('_ route'), atau variannya, ia akan mengembalikan '_internal' untuk kasus-kasus di mana penerusan berlangsung.

Jika Anda memerlukan solusi yang berfungsi bahkan dengan penerusan, Anda harus menggunakan layanan RequestStack baru, yang tiba di 2.4, tetapi ini akan mematahkan dukungan ESI :

$requestStack = $container->get('request_stack');
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI
if ($masterRequest) {
    echo $masterRequest->attributes->get('_route');
}

Anda dapat membuat ekstensi ranting dari ini jika Anda membutuhkannya di templat.

K. Norbert
sumber
Jadi ... bagaimana solusi Anda tidak bekerja untuk semua kasus penggunaan dengan tepat?
greg0ire
11

_routebukan cara untuk pergi dan tidak pernah ada . Itu selalu dimaksudkan untuk keperluan debugging menurut Fabien yang menciptakan Symfony. Ini tidak dapat diandalkan karena tidak akan bekerja dengan hal-hal seperti penerusan dan panggilan langsung lainnya ke pengontrol seperti rendering parsial.

Anda perlu menyuntikkan nama rute Anda sebagai parameter di controller Anda, lihat dokumen di sini

Juga, tolong jangan pernah gunakan $request->get('');jika Anda tidak memerlukan fleksibilitas itu jauh lebih lambat daripada menggunakan mendapatkan pada tas properti tertentu yang Anda butuhkan (atribut, permintaan atau permintaan) jadi $request->attributes->get('_route');dalam hal ini.

Tom Tom
sumber
4
Oke, pada dasarnya Anda menyarankan untuk menambahkan informasi tambahan ke setiap rute dalam file ini alih-alih mendapatkan nama rute? ...
Charaf
1
Yap terutama jika Anda harus dapat memanggil controller itu sendiri kemudian di telepon (ke depan, rendering parsial, dll ...) melewati nama sebagai parameter adalah satu-satunya cara di sini karena Anda tidak memanggil rute sama sekali dalam hal itu kasus. Adapun _route dimaksudkan untuk tujuan debug jangan bawa saya ^^ '
Tom Tom
7
$request->attributes->get('_route');

Anda bisa mendapatkan nama rute dari objek permintaan dari dalam pengontrol.

Venkat Kotra
sumber
4

Semua yang saya dapat dari itu _internal

Saya mendapatkan nama rute dari dalam controller dengan $this->getRequest()->get('_route'). kode Even tuxedo25 menyarankan untuk dikembalikan_internal

Kode ini dieksekusi dalam apa yang disebut 'Komponen' di Symfony 1.X; Bukan pengontrol halaman tetapi bagian dari halaman yang membutuhkan logika.

Kode yang setara di Symfony 1.X adalah: sfContext::getInstance()->getRouting()->getCurrentRouteName();

alexismorin
sumber
2
Memecahkannya sendiri. Dalam sebuah tampilan:$view['request']->getParameter('_route');
alexismorin
5
ini karena Anda menggunakan {% render... %}panggilan dengan standalone=true. Dengan caching (AppCache.php atau pernis dengan ESI) diaktifkan, ini akan menyebabkan tampilan mandiri diminta dengan Permintaan HTTP terpisah (ini adalah rute yang _internalberperan) agar ro dapat di-cache secara independen.
Martin Schuhfuß
2

Dengan Symfony 3.3, saya telah menggunakan metode ini dan berfungsi dengan baik.

Saya punya 4 rute

admin_category_index, admin_category_detail, admin_category_create, admin_category_update

Dan hanya satu baris membuat kelas aktif untuk semua rute.

<li  {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}>
 <a href="{{ path('admin_category_index') }}">Product Categoires</a>
</li>
Muhammad Shahzad
sumber
1

Untuk mendapatkan rute saat ini berdasarkan pada URL (lebih dapat diandalkan dalam hal ke depan):

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;
}
Alain Tiemblo
sumber
0

Dengan Symfony 4.2.7, saya dapat mengimplementasikan yang berikut ini di templat ranting saya, yang menampilkan nama rute kustom yang saya definisikan di controller saya.

Di index.html.twig

<div class="col">
    {% set current_path =  app.request.get('_route') %}
    {{ current_path }}
</div>

Di controller saya


    ...

    class ArticleController extends AbstractController {
        /**
         * @Route("/", name="article_list")
         * @Method({"GET"})
         */
        public function index() {
        ...
        }

        ...
     }

Hasilnya mencetak "article_list" ke halaman yang diinginkan di browser saya.

Klewis
sumber
0

Bagi siapa pun yang membutuhkan rute saat ini untuk Symfony 3, inilah yang saya gunakan

<?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.
?>
Aderemi Dayo
sumber
3
Ini tidak akan mengembalikan nama rute yang ditangani
Nico Haase
@NicoHaase Ini bukan ilmu roket, Anda sudah memiliki objek permintaan
Aderemi Dayo
-2

jika Anda ingin mendapatkan nama rute di controller Anda daripada Anda harus menyuntikkan permintaan (alih-alih mendapatkan dari wadah karena Symfony UPGRADE dan daripada panggilan panggilan ('_ rute').

public function indexAction(Request $request)
{
    $routeName = $request->get('_route');
}

jika Anda ingin mendapatkan nama rute dalam ranting daripada Anda harus mendapatkannya seperti

{{ app.request.attributes.get('_route') }}
Vazgen Manukyan
sumber
1
Tidak disarankan untuk digunakan $request->get()secara langsung karena lambat: github.com/symfony/http-foundation/blob/2.8/Request.php#L712
ricko zoe