web-dev-qa-db-ja.com

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

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

142
Mark Cibor
{{ 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など、コントローラで使用できるサービスを参照する、あらゆる種類の便利なショートカットが含まれています。

226
Rodney Folz

取得現在のURL{{ app.request.uri }} in Symfony 2.3、3、4


取得パスのみ{{ app.request.pathinfo }}

171
mrzmyr

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

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

Symfony 2.0では、1つの解決策はこれのために小枝の拡張子を書くことです

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つを変更したい場合以外は、これらすべてを必要とすることはありません。

114
Bártfai Tamás

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

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}
32
Zaheer Babar

URLに追加のクエリパラメータが設定されている場合、それはnot設定されたルートの一部である場合、承認された回答は現在の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 }))) }}

それは本当に醜いですが、ページネーションを開発しているなら、それぞれの別々のリンクのpage変数を修正する必要があるでしょう、それであなたは毎回全部を含まなければなりません。おそらく他の人はより良い解決策を持っています。

18
Chadwick Meyer

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'))

1
Tim