Symfony 2で現在のルートを取得する方法は?


224

Symfony 2で現在のルートを取得するにはどうすればよいですか?

たとえば、routing.yml次のとおりです。

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

どうすればこのsomePage値を取得できますか?

回答:


323

ContainerAware(コントローラーなど)から:

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

2
あなたがチェックのためにswitchwation @got meta.stackexchange.com/questions/155258/...を
NullPoiиteя

37
github.com/symfony/symfony/issues/854 request.attributes.get( '_ route')は、デバッグ目的のみであり(symfony devによる)、リクエストが転送されると機能しないため、信頼できません... supernovaの回答を参照してください文書化され、よりフェイルセーフです
luiges90

3
何かが転送されるときにこれが機能しない理由は、ルートではなくコントローラーに直接転送するという事実によるものです。そのため、symfonyはそれがどのルートであるかを知りません。通常、1つのコントローラーへのルートが1つあるため、「_ internal」以外に何も報告できないのは奇妙に思えるかもしれませんが、複数のルート定義に関連付けられた汎用コントローラーを作成することは可能です。これらすべてを考えると、この「ゴッチャ」はもっと理にかなっていると思います。
jzimmerman2011 2014年

@ tuxedo25 RequestStackの使用を検討してください:symfony.com/blog/new-in-symfony-2-4-the-request-stack
mYkon

2
$ request-> get( '_ route'); 遅い !$ request-> attributes-> get( '_ route'); 柔軟性が必要ない場合はより良い
Tom Tom

190

小枝あり: {{ app.request.attributes.get('_route') }}


8
ありがとうございました!<body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">ページ固有のcssを適用するために使用しています:)
Salman von Abbas

10
github.com/symfony/symfony/issues/854 request.attributes.get( '_ route')は、デバッグのみを目的としており(symfony devによる)、リクエストが転送された場合に機能しないため、信頼できません... supernovaの回答を参照してください文書化され、よりフェイルセーフです
luiges90

48

これはこれを行う最も簡単な方法だと思います:

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

    .....

3
説明を追加したり、サンプル出力を表示して、問題がどのように解決されるかを明確にできますか?
チャーリー


1
@Charlie一致するルート「名前」を提供する定義済みの変数です
超新星

2
これは間違いなく元の質問に対する最良の答えです。余談ですが、のようなサブリクエストでは機能しません{% render "SomeBundle:SomeController:someAction" %}。この場合、値「_internal」が再び取得されます。
netmikey 2013年

2
残念なことに、これは元のアクションでのみ機能し、他の機能では転送する必要があります。
DarekWędrychowski2013年

27

symfony 2.0-2.1
これを使用してください:

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

それはあなたに与えないでしょう_internal

Symfony 2.2以降のアップデート:Symfony 2.2以降では、これは機能しません。バグをオープンしましたが、その答えは「仕様による」ものでした。ルートをサブアクションで取得したい場合は、それを引数として渡す必要があります

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

そしてあなたのコントローラー:

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

github.com/symfony/symfony/issues/854これについてはよくわかり$route['_route']ません。問題があるようですが、symfonyのdevの話ではないかもしれません。クックブックは出力について_routeは触れていません$router->match()..
luiges90

@ luiges90に完全に同意します。のPHPDoc $router->match()は「@return arrayパラメータの配列」と言っていますが、これは非常に内部的なものです。私はそれに頼りたくありませんが、今のところ、それはサブリクエストを処理するときに実行可能な唯一の解決策のようです。
netmikey 2013年

19

すべてのユースケースで機能する解決策はありません。$ request-> get( '_ route')メソッドまたはそのバリアントを使用すると、転送が行われた場合に'_internal'が返されます。

転送でも機能するソリューションが必要な場合は、2.4で提供された新しいRequestStackサービスを使用する必要がありますが、これによりESIサポートが無効になります。

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

テンプレートで必要な場合は、これからtwig拡張機能を作成できます。


それで…あなたの解決策はどのようにすべてのユースケースに対して正確に機能しないのですか?
greg0ire 2017

11

_route行く方法ではなく、かつてなかった。Symfonyを作成したFabienによると、これは常にデバッグ目的で使用されていました。部分的なレンダリングなど、コントローラへの転送やその他の直接呼び出しなどでは機能しないため、信頼性が低くなります。

ルートの名前をコントローラーのパラメーターとして挿入する必要があります。こちらのドキュメントを参照してください

また、$request->get('');柔軟性が必要ない場合は使用しないでください$request->attributes->get('_route');。この場合、必要な特定のプロパティバッグ(属性、クエリ、または要求)でgetを使用するよりもはるかに低速です。


4
わかりました、ルート名を取得するのではなく、このファイルのすべてのルートに追加情報を追加することをお勧めしますか?…
Charaf

1
はい、特にコントローラー自体を後で呼び出すことができるようにする必要がある場合(転送、部分的なレンダリングなど)は、パラメーターとして名前を渡すことが、ルートをまったく呼び出さないため、ここでの唯一の方法です。場合。_routeがデバッグ目的で使用されていることについては、私にそれを出さないでください^^ '
Tom Tom

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

コントローラー内のリクエストオブジェクトからルート名を取得できます。


4

それから私が得ているすべては _internal

コントローラー内からルート名を取得$this->getRequest()->get('_route'). しますが、コードtuxedo25が返すコードも_internal

このコードは、Symfony 1.Xでは「コンポーネント」と呼ばれていたもので実行されます。ページのコントローラーではなく、ロジックが必要なページの一部です。

Symfony 1.Xでの同等のコードは次のとおりです。 sfContext::getInstance()->getRouting()->getCurrentRouteName();


2
自分で解決しました。見解:$view['request']->getParameter('_route');
alexismorin '17年

5
これは、で{% render... %}呼び出しを使用しているためですstandalone=true。キャッシング(AppCache.phpまたはESIを備えたニス)を有効にすると、独立したキャッシュが可能になるように、独立したHTTPリクエスト(これがルート_internalが機能する場所)を使用してスタンドアロンビューがリクエストされます。
MartinSchuhfuß12年

2

Symfony 3.3では、この方法を使用して問題なく動作しました。

私は4つのルートがあります

admin_category_index、admin_category_detail、admin_category_create、admin_category_update

そして、1行だけですべてのルートのアクティブクラスを作成します。

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

1

URLに基​​づいて現在のルートを取得するには(転送の場合はより信頼できる):

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を使用すると、twigテンプレートに以下を実装できます。これにより、コントローラーで定義したカスタムルート名が表示されます。

index.html.twig内

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

私のコントローラーで


    ...

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

        ...
     }

結果として、「article_list」がブラウザの目的のページに出力されます。


0

Symfony 3の現在のルートが必要な人は、これを使用します

<?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
これは、処理されたルートの名前を返しません
Nico Haase

@NicoHaaseロケットサイエンスではありません。すでにリクエストオブジェクトを持っています
Aderemi Dayo

-2

コントローラでルート名を取得したい場合は、リクエストをインジェクトする必要があります(Symfonyのアップグレードのためにコンテナから 取得してget( '_ route'を呼び出すのではなく)。

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

ルート名を小枝で取得したい場合は、次のように取得する必要があります

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

1
$request->get()遅いため、直接使用することはお勧めしません:github.com/symfony/http-foundation/blob/2.8/Request.php#L712
ricko zoe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.