テンプレートで現在へのリンクを作成するにはどうすればよいですか?
さまざまな言語で現在のページにリンクする言語スイッチャーを作成したいので、すべてのパラメーターはロケールを除いて同じでなければなりません。
私はこれのために自分の機能をロールアウトすることになります。最初はどこかに含まれていましFrameworkBundle
たが、それについては何も見つかりませんでした。ここで私が取った手順。
最初に、ユーザーが現在アクセスしているルートと同じルートを出力する Twig 拡張関数を作成しました (パラメーターとクエリ文字列が含まれています)。このステップはあなたに任せました。まだ方法がわからない場合は、Twig 拡張機能の作成方法の説明について、Symfony2 の優れたチュートリアルからこのリンクを参照できます。必要があればお手伝いします。
次のステップは、現在のルートのロケールを切り替える関数自体を作成することです。この関数は、依存関係としてRequest
およびRouter
オブジェクトを必要とします。私の個人的なケースでは、この関数を service という名前の専用サービスに入れましたRoutingHelper
。このサービスは、私の Twig 拡張機能によって使用されます。依存関係コンテナーに追加したサービス定義は次のとおりです。
acme.helper.routing:
class: Application\AcmeBundle\Helper\RoutingHelper
scope: "request"
arguments:
request: "@request"
router: "@router"
そして私のサービスのコンストラクタ:
protected $request;
protected $router;
public function __construct($request, $router)
{
$this->request = $request;
$this->router = $router;
}
$locale パラメータは、切り替え先の新しいロケールです。ここで機能:
public function localizeCurrentRoute($locale)
{
$attributes = $this->request->attributes->all();
$query = $this->request->query->all();
$route = $attributes['_route'];
# This will add query parameters to attributes and filter out attributes starting with _
$attributes = array_merge($query, $this->filterPrivateKeys($attributes));
$attributes['_locale'] = $locale;
return $this->router->generate($route, $attributes);
}
基本的に、他の人がこれまでに行ったことを行いますが、パラメーターとクエリ文字列も処理します。このメソッドfilterPrivateKeys
は、ルート属性からプライベート属性を削除します。これらの属性はアンダースコアで始まる属性であり、ルート ジェネレーターに戻すべきではありません。ここでその定義:
private function filterPrivateKeys($attributes)
{
$filteredAttributes = array();
foreach ($attributes as $key => $value) {
if (!empty($key) && $key[0] != '_') {
$filteredAttributes[$key] = $value;
}
}
return $filteredAttributes;
}
最後に、Twig ビューでこれを実行して、ロケールを切り替えるためのリンクを作成できます。
{% block language_bar %}
<a href="{{ localize_route('en') }}"> English </a>
<a href="{{ localize_route('fr') }}"> Français </a>
{% endblock %}
編集:
ここに私の小枝拡張サービスの定義があります:
acme.twig.extension:
class: Application\AcmeBundle\Twig\Extension\AcmeExtension
arguments:
container: "@service_container"
tags:
- { name: twig.extension }
小枝拡張機能では、次の呼び出しがあります。$routingHelper = $this->container->get('acme.helper.routing');
これにより、小枝拡張機能がリクエストスコープにないために発生するスコープ拡大例外が解決されるはずです。
アップデート:
Symfony 2.1 では、以前よりも簡単な方法でロケール スイッチャーを使用できるようになりました。実際、Symfony の 2.1 バージョンでは、ルートの新しいパラメーターが導入され、ロケール スイッチャーをより簡単に実行できるようになりました。ここにコード、すべて小枝で
{% set route_params = app.request.attributes.get('_route_params') %}
{# merge the query string params if you want to keep them when switching the locale #}
{% set route_params = route_params|merge(app.request.query.all) %}
{# merge the additional params you want to change #}
{% set route_params = route_params|merge({'_locale': 'fr'}) %}
{{ path(app.request.attributes.get('_route'), route_params) }}
まだ数行の twig コードですが、再利用しやすいように Twig ブロックに含めることができます。上記のコードについては、Symfony コミュニティの stof に感謝します。
これがあなたが探しているものであることを願っています。
よろしく、
マット
<a href="{{ path(app.request.get('_route'), {'_locale': 'en'}) }}">English</a>
<a href="{{ path(app.request.attributes.get('_route')) }}">Current page</a>
同様の質問:現在のページを変更せずに言語を切り替える