小枝テンプレートで現在のURLを取得しますか?


169

Twigテンプレートの現在のパスを取得するためのコードを探しました(完全なURLではなく)。つまりhttp://www.sitename.com/page、必要ではなく、必要なだけです/page


11
回答#2には、リンクされた質問では提供されない(要求パラメーターに関する)必要な情報が含まれているため、これは正確な複製ではありません。回答2をリンクされた質問にマージする必要があります。
ビクターSergienko

1
app.request.requestUriを試してください。
クリストフ・ドンビ

7
だまされない。再開するための投票。今は答えられないのでコメントとしてコメントを投稿します... {{ app.request.getBaseUrl ~ app.request.getPathInfo }}getBaseUrlビットはオプションです。ドメインのルートにインストールされていない場合にのみ必要です)
mpen

回答:


250
{{ path(app.request.attributes.get('_route'),
     app.request.attributes.get('_route_params')) }}

それをビュー変数に読み込みたい場合:

{% set currentPath = path(app.request.attributes.get('_route'),
                       app.request.attributes.get('_route_params')) %}

appグローバルビューの変数は、以下のような便利なショートカットのすべての種類、含まれているapp.sessionapp.security.token.user、その参照あなたがコントローラで使用する可能性のあるサービスを。


9
残念ながら、必須パラメーターのあるルートがある場合、これは機能しません。
MartinSchuhfuß12年

SymfonyなしでTwigを使用している場合は、次のようにすることができます:$ twig-> addGlobal( "CurrentUrl"、$ _SERVER ["REQUEST_URI"]);
GateKiller、

1
ルートに必須パラメータがある場合は、以下の回答をご覧ください。
Sam

@GateKillerこれにより、機能テストが失敗しました:Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
Robin

素晴らしい回答をありがとう、とても役に立ちました!
Vahe Shadunts 2015年

199

取得現在のURLを{{ app.request.uri }}symfonyの2.3、3、4、5


パスのみを取得:({{ app.request.pathinfo }}パラメーターなし)


リクエストURIを取得:({{ app.request.requesturi }}パラメーター付き)


1
これは私のために働いた唯一のものです。他のすべては、ルートの一部ではない、またはTwigではなくコントローラーに依存するクエリパラメーターを逃しました。
クレイグ

13
パスを取得するに{{ app.request.pathinfo }}は、次の場所で利用可能なメソッドのリストのみを試すか参照してください/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
Michael

2
これが正解です。短くて滑らか。
Fabian Picone 2017

2
uriパラメータ付きのURLを取得します。 pathinfoパスを取得NOのパラメータを。 requestUriパスWITHパラメータを取得します。 requestUriこの回答IMOに追加する必要があります。ドメインが必要になることはほとんどありません。また、パラメーターを削除することはほとんどありません。
rybo111

115

symfony 2.1ではこれを使うことができます:

{{ path(app.request.attributes.get('_route'), 
        app.request.attributes.get('_route_params')) }}

symfony 2.0では、1つの解決策はこれのためのtwig拡張を書くことです

public function getFunctions()
{
    return array(
        'my_router_params' => new \Twig_Function_Method($this, 'routerParams'),
    );
}

/**
 * Emulating the symfony 2.1.x $request->attributes->get('_route_params') feature.
 * Code based on PagerfantaBundle's twig extension.
 */
public function routerParams()
{
    $router = $this->container->get('router');
    $request = $this->container->get('request');

    $routeName = $request->attributes->get('_route');
    $routeParams = $request->query->all();
    foreach ($router->getRouteCollection()->get($routeName)->compile()->getVariables() as $variable) {
        $routeParams[$variable] = $request->attributes->get($variable);
    }

    return $routeParams;
}

そしてこのように使います

{{ path(app.request.attributes.get('_route'), my_router_params()|merge({'additional': 'value'}) }}

ページャーのようにリンクにパラメーターを追加したり、パラメーターの1つを変更したりしない限り、これらすべては必要ありません。


11
Twigで現在のリンクを生成し、言語切り替えのロケールを変更する場合は、Symfony 2.1で次のように実行できます:{{path(app.request.attributes.get( '_ route')、app.request.attributes .get( '_ route_params')| merge({'_ locale': 'ja'}))}}
BártfaiTamásに

2.0の実装では、コンテナーがないというエラーが表示されます。PagerfantaBundleで行ったように変数を追加しましたが、ContainerInterfaceを実装する必要があると表示されますか?
Squazic

$ containerパラメータを持つこの拡張機能のコンストラクタを作成する必要があります。次に、DIC構成で、コンテナーを拡張のパラメーターとして宣言する必要があります。ここTwigBundleのように
Bártfaiタマシュ

12
クエリ文字列に追加のパラメーターがある場合、_route_parametersは機能しません。代わりにapp.request.query.allを使用できます。
wdev

34

次のようにTwigで現在のURLを取得できます。

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}

20

である、あなたはあなたのURLに追加のクエリパラメータを持っている場合ことに留意すべきでありません構成されたルートの一部で場合、受け入れられた回答はそれらを現在のURL(パス)に含めないことに注意してください。

なぜ追加のパラメーターが必要なのですか?

たとえば、キーワードでフィルターできるレコードを含むリストページがあり、ページにページ分割がある場合、 "keyword"および "page"のクエリ変数はルートに含まれない可能性があります。ただし、ページングの進むボタンと戻るボタンでは、現在の完全なURL(次のページが引き続きフィルターされるようにキーワードを含む)が必要です。そして、ページ変数を変更する必要があります。

追加のクエリパラメータをマージする方法

したがって、現在のルートを取得して、追加の変数をマージできます(これらの追加の変数の1つ以上を変更した後)。独自の変数をにマージしてから、app.request.query.allその配列をにマージすることに注意してくださいapp.request.attributes.get('_route_params')。このpath()方法では、ルートに必要なすべてのパラメータを指定する必要があるため、を含める必要があります_route_params

{{ path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')|merge(app.request.query.all|merge({'page': 2 }))) }}

これは本当に醜いですが、ページネーションを開発している場合は、個別のリンクごとにページ変数を変更する必要があるため、毎回すべてを含める必要があります。おそらく他の人がより良い解決策を持っています。


2
おそらくする必要があります{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
FDisk

2

Silex 2を使用している場合、Requestオブジェクトにアクセスできなくなります。

この方法で現在のリクエスト属性にアクセスできます。

app.request_stack.currentrequest.attributes.get('_route')

そして、完全な現在のURLを生成するには: path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))


次のように、Twig / Silex 2で現在のURLを取得できますglobal.request.attributes.get('_route')Twigブリッジが必要です。
dsoms 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.