web-dev-qa-db-ja.com

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

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

例えば、routing.yml

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

このsomePageの値を取得する方法

212
IlyaDoroshin

ContainerAwareというものから(コントローラーのように):

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

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

189
Matthieu

これが最も簡単な方法だと思います。

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

    .....
47
supernova

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以降では動作していません。私は bug を開き、答えは "仕様による"でした。あなたがサブアクションでルートを取得したい場合は、引数としてそれを渡す必要があります

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

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

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

すべてのユースケースに有効な解決策はありません。あなたが$ 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');
}

あなたがテンプレートでそれを必要とするならば、あなたはこれから小枝拡張を作ることができます。

19
K. Norbert

_routeは行く道ではなく、決してありませんでした常にデバッグを目的としていました Symfonyを作成したFabienによると。転送や部分レンダリングのようなコントローラへのその他の直接呼び出しなどでは機能しないため、信頼性が低くなります。

あなたのコントローラのパラメータとしてあなたのルートの名前をインジェクトする必要があります ここのドキュメントを見てください

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

11
Tom Toms
$request->attributes->get('_route');

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

7
Venkat Kotra

私がそれから得ているのは_internalだけです

私は$this->getRequest()->get('_route').でコントローラの中からルート名を取得します。tuxedo25が提案したコードでさえ_internalを返します。

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

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

4
alexismorin

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>
2

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

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
?>
1
Aderemi Dayo

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
klewis