Symfony 2で現在のルートを取得するにはどうすればいいですか?
例えば、routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
このsomePage
の値を取得する方法
ContainerAwareというものから(コントローラーのように):
$request = $this->container->get('request');
$routeName = $request->get('_route');
小枝と:{{ app.request.attributes.get('_route') }}
これが最も簡単な方法だと思います。
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
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) { ... }
すべてのユースケースに有効な解決策はありません。あなたが$ 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');
}
あなたがテンプレートでそれを必要とするならば、あなたはこれから小枝拡張を作ることができます。
_route
は行く道ではなく、決してありませんでした。 常にデバッグを目的としていました Symfonyを作成したFabienによると。転送や部分レンダリングのようなコントローラへのその他の直接呼び出しなどでは機能しないため、信頼性が低くなります。
あなたのコントローラのパラメータとしてあなたのルートの名前をインジェクトする必要があります ここのドキュメントを見てください
また、柔軟性を必要としない場合は$request->get('');
を使用しないでください。必要な特定のプロパティバッグ(属性、クエリ、または要求)でgetを使用するよりも遅い場合があります。この場合は$request->attributes->get('_route');
です。
$request->attributes->get('_route');
コントローラ内からリクエストオブジェクトからルート名を取得できます。
私がそれから得ているのは_internal
だけです
私は$this->getRequest()->get('_route').
でコントローラの中からルート名を取得します。tuxedo25が提案したコードでさえ_internal
を返します。
このコードはSymfony 1.Xで 'Component'と呼ばれていたもので実行されます。ページのコントローラではなく、ロジックを必要とするページの一部です。
Symfony 1.Xの同等のコードは以下のとおりです。sfContext::getInstance()->getRouting()->getCurrentRouteName();
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>
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;
}
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
?>
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"を私のブラウザの希望のページに出力します。