回答:
ContainerAware(コントローラーなど)から:
$request = $this->container->get('request');
$routeName = $request->get('_route');
小枝あり: {{ app.request.attributes.get('_route') }}
<body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">
ページ固有のcssを適用するために使用しています:)
これはこれを行う最も簡単な方法だと思います:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
{% render "SomeBundle:SomeController:someAction" %}
。この場合、値「_internal」が再び取得されます。
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) { ... }
$route['_route']
ません。問題があるようですが、symfonyのdevの話ではないかもしれません。クックブックは出力について_route
は触れていません$router->match()
..
$router->match()
は「@return arrayパラメータの配列」と言っていますが、これは非常に内部的なものです。私はそれに頼りたくありませんが、今のところ、それはサブリクエストを処理するときに実行可能な唯一の解決策のようです。
すべてのユースケースで機能する解決策はありません。$ 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拡張機能を作成できます。
_route
行く方法ではなく、かつてなかった。Symfonyを作成したFabienによると、これは常にデバッグ目的で使用されていました。部分的なレンダリングなど、コントローラへの転送やその他の直接呼び出しなどでは機能しないため、信頼性が低くなります。
ルートの名前をコントローラーのパラメーターとして挿入する必要があります。こちらのドキュメントを参照してください
また、$request->get('');
柔軟性が必要ない場合は使用しないでください$request->attributes->get('_route');
。この場合、必要な特定のプロパティバッグ(属性、クエリ、または要求)でgetを使用するよりもはるかに低速です。
それから私が得ているすべては
_internal
コントローラー内からルート名を取得$this->getRequest()->get('_route').
しますが、コードtuxedo25が返すコードも_internal
このコードは、Symfony 1.Xでは「コンポーネント」と呼ばれていたもので実行されます。ページのコントローラーではなく、ロジックが必要なページの一部です。
Symfony 1.Xでの同等のコードは次のとおりです。 sfContext::getInstance()->getRouting()->getCurrentRouteName();
$view['request']->getParameter('_route');
{% render... %}
呼び出しを使用しているためですstandalone=true
。キャッシング(AppCache.phpまたはESIを備えたニス)を有効にすると、独立したキャッシュが可能になるように、独立したHTTPリクエスト(これがルート_internal
が機能する場所)を使用してスタンドアロンビューがリクエストされます。
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 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」がブラウザの目的のページに出力されます。
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.
?>
コントローラでルート名を取得したい場合は、リクエストをインジェクトする必要があります(Symfonyのアップグレードのためにコンテナから 取得してget( '_ route'を呼び出すのではなく)。
public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}
ルート名を小枝で取得したい場合は、次のように取得する必要があります
{{ app.request.attributes.get('_route') }}
$request->get()
遅いため、直接使用することはお勧めしません:github.com/symfony/http-foundation/blob/2.8/Request.php#L712