Symfony 2 geçerli güzergahı için nasıl?


224

Symfony 2 geçerli güzergahını nasıl alabilirim ?

Örneğin routing.yml:

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

Bu somePagedeğeri nasıl alabilirim ?

Yanıtlar:


323

ContainerAware olan bir şeyden (denetleyici gibi):

$request = $this->container->get('request');
$routeName = $request->get('_route');

2
@ sizin için bir geçiş yapmayı kontrol edin meta.stackexchange.com/questions/155258/…
NullPoiиteя

37
github.com/symfony/symfony/issues/854 request.attributes.get ('_ route') güvenilir değildir, çünkü yalnızca hata ayıklama amaçlıdır (symfony dev dedi) ve istek iletilirse çalışmaz ... bkz. süpernova'nın cevabı belgelenmiştir ve daha güvenli değildir
luiges90 14:12

3
Bir şey iletildiğinde bunun çalışmamasının nedeni, bir rotaya değil, doğrudan bir denetleyiciye iletmenizdir. Bu nedenle Symfony bunun hangi yol için olduğunu bilmiyor. Genellikle, bir denetleyiciye bir yolunuz vardır, bu nedenle bunun "_internal" dışında bir şey raporlayamaması garip gelebilir, ancak, birden fazla yol tanımıyla ilişkilendirilen genel amaçlı denetleyiciler oluşturmak mümkündür. Tüm bunları düşündüğünüzde, bu "gotcha" nın daha anlamlı olduğunu düşünüyorum.
jzimmerman2011

@ tuxedo25 RequestStack kullanmayı düşünün: symfony.com/blog/new-in-symfony-2-4-the-request-stack
mYkon

2
$ request-> get ( '_ rota'); yavaş ! $ request-> öznitelikleri üzerinden> get ( '_ rota'); esnekliğe ihtiyacınız yoksa daha iyi
Tom Tom

190

Dal ile: {{ app.request.attributes.get('_route') }}


8
Teşekkür ederim! Sayfaya <body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">özgü css uygulamak için kullanıyorum :)
Salman von Abbas

10
github.com/symfony/symfony/issues/854 request.attributes.get ('_ route') güvenilir değildir, çünkü yalnızca hata ayıklama amaçlıdır (symfony dev dedi) ve istek iletilirse çalışmaz ... bkz. süpernova'nın cevabı belgelenmiştir ve daha güvenli değildir
luiges90 14:12

48

Bence bunu yapmanın en kolay yolu:

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

    .....

3
Sorunu nasıl çözdüğünü açıklamak için daha fazla açıklama ekleyebilir veya örnek çıktı gösterebilir misiniz?
Charlie


1
@Charlie Size eşleşen "name" rotasını veren önceden tanımlı bir değişkendir
supernova

2
Bu kesinlikle orijinal sorunun en iyi cevabıdır. Bir yan not olarak: ancak, {% render "SomeBundle:SomeController:someAction" %}'_internal' değerini tekrar alacağınız gibi alt isteklerle çalışmaz.
netmikey

2
Yazık ki, bu sadece orijinal Eylemde çalışır, diğer işlevler için iletilmesi gerekir.
Darek Wędrychowski

27

Symfony 2.0-2.1
Bunu kullanın:

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

Bu bir olacak değil size _internal.

Symfony 2.2+ için güncelleştirme: Bu Symfony 2.2+ sürümünden başlayarak çalışmıyor. Ben bir hata açtım ve cevap "tasarım gereğiydi". Rotayı bir alt eylemde almak istiyorsanız, onu bir argüman olarak iletmeniz gerekir

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

Ve kontrolörünüz:

public function menuAction($route) { ... }

github.com/symfony/symfony/issues/854 Bundan emin değilim, $route['_route']sorunlu gözüküyor ama symfony dev hakkında konuşmuyor olabilir. Hakkında söz etmez yemek kitabı _routeait $router->match()çıktı ..
luiges90

@ Luiges90 ile tamamen katılıyorum. PHPDoc, $router->match()"@return array Çok dahili görünen bir parametre dizisi" diyor . Buna güvenmek istemiyorum, ancak şu anda, alt taleplerle uğraşırken tek uygulanabilir çözüm gibi görünüyor.
netmikey

19

Tüm kullanım durumları için çalışan bir çözüm yoktur. $ Request-> get ('_ route') yöntemini veya varyantlarını kullanırsanız, yönlendirmenin gerçekleştiği durumlar için '_internal' döndürülür .

Yönlendirme ile bile çalışan bir çözüme ihtiyacınız varsa, 2.4'te gelen yeni RequestStack hizmetini kullanmanız gerekir, ancak bu ESI desteğini bozacaktır :

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

Şablonlarda ihtiyacınız varsa bir dal uzantısı yapabilirsiniz.


Peki… çözümünüz tüm kullanım senaryolarında tam olarak nasıl çalışmıyor?
greg0ire

11

_routegitmek için bir yol değil ve asla değildi . Symfony'yi yaratan Fabien'e göre her zaman hata ayıklama amaçlıydı . Yönlendirme ve kısmi oluşturma gibi denetleyicilere diğer doğrudan çağrılar gibi şeylerle çalışmayacağı için güvenilir değildir.

Rotanızın adını denetleyicinize bir parametre olarak enjekte etmeniz gerekir, buradaki dokümana bakın

Ayrıca, $request->get('');esnekliğe ihtiyacınız yoksa, ihtiyacınız olan belirli özellik çantasını (öznitelikler, sorgu veya istek) kullanmaktan çok daha yavaş olduğu için lütfen $request->attributes->get('_route');bu durumda kullanmayın.


4
Tamam, temel olarak bu dosyadaki her rotaya rota adını almak yerine fazladan bilgi eklemeyi öneriyorsunuz? …
Charaf

1
Evet, özellikle denetleyicinin kendisini daha sonra hattan (ileri, kısmi oluşturma vb.) Çağırabilmeniz gerekiyorsa, adı bir parametre olarak iletmek burada tek yoldur çünkü durum. _Route hata ayıklama amaçlı gelince beni dışarı çıkarmayın ^^ '
Tom Tom

7
$request->attributes->get('_route');

Yol adını istek nesnesinden denetleyicinin içinden alabilirsiniz.


4

Bundan aldığım tek şey _internal

$this->getRequest()->get('_route'). Tuxedo25 kodu bile döndüren bir denetleyicinin içinden yol adını alıyorum_internal

Bu kod Symfony 1.X 'Bileşen' olarak adlandırılan kod içinde yürütülür; Bir sayfanın denetleyicisi değil, sayfanın bir kısmı mantık gerektiren bir kısmı.

Symfony 1.X içindeki eşdeğer kod: sfContext::getInstance()->getRouting()->getCurrentRouteName();


2
Kendim çözdüm. Bir görünümde:$view['request']->getParameter('_route');
alexismorin

5
bunun nedeni {% render... %}ile aramaları kullanmanızdır standalone=true. Önbelleğe alma (AppCache.php veya ESI ile vernik) etkinleştirildiğinde, bu, _internalbağımsız olarak önbelleğe alınabilmesi için bağımsız görünümlerin ayrı bir HTTP İsteği ile istenmesine neden olur (bu, rotanın devreye girdiği yerdir ).
Martin Schuhfuß

2

Symfony 3.3 ile bu yöntemi kullandım ve iyi çalışıyorum.

4 rotam var

admin_category_index, admin_category_detail, admin_category_create, admin_category_update

Ve sadece bir satır tüm rotalar için aktif bir sınıf oluşturur.

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

1

Geçerli rotayı URL'ye göre almak için (ileriye dönük durumlarda daha güvenilir):

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

0

Symfony 4.2.7 ile, denetleyicilerimde tanımladığım özel rota adını gösteren dal şablonuma aşağıdakileri uygulayabiliyorum.

İndex.html.twig içinde

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

Kontrol cihazımda


    ...

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

        ...
     }

Sonuç, tarayıcımda istenen sayfaya "makale_listesi" yazdırılır.


0

Symfony 3 için geçerli rotaya ihtiyaç duyan herkes için, bunu kullanıyorum

<?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.
?>

3
Bu , ele alınan rotanın adını döndürmez
Nico Haase

@NicoHaase Roket bilimi değil, zaten istek nesnesine
sahipsiniz

-2

denetleyicinizde rota adını almak istiyorsanız isteği enjekte etmeniz gerekir ( Symfony UPGRADE nedeniyle konteynırdan almak yerine get ('_ route') çağırın.

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

Eğer rota adını dalda almak istiyorsanız,

{{ app.request.attributes.get('_route') }}

1
$request->get()Yavaş olduğu için doğrudan kullanılması önerilmez : github.com/symfony/http-foundation/blob/2.8/Request.php#L712
ricko zoe
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.