2

如何在我的模板中创建指向当前的链接?

我想创建一个语言切换器,它应该链接到各种语言的当前页面,因此所有参数都应该与语言环境相同。

4

3 回答 3

7

我最终为此推出了自己的功能。我虽然起初它被包含在某个地方,FrameworkBundle但没有找到任何关于它的东西。这是我采取的步骤。

起初,我创建了一个 Twig 扩展函数,该函数将输出与用户当前正在访问的路径相同的路径(包括参数和查询字符串)。我把这一步留给了你。如果您还不知道如何创建 Twig 扩展,您可以从 Symfony2 上的一个很好的教程中查看此链接,以了解如何创建 Twig 扩展。如果您需要,我可以帮助您。

下一步是创建将切换当前路由的语言环境的函数本身。此函数将需要RequestRouter对象作为依赖项。就我个人而言,我将此功能放在名为RoutingHelperservice 的专用服务中。然后,我的 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 的学分,用于上面的代码。

希望这是您正在寻找的。

问候,
马特

于 2012-04-04T15:25:14.603 回答
1
<a href="{{ path(app.request.attributes.get('_route')) }}">Current page</a>

类似问题:语言切换不改变当前页面

于 2012-04-04T12:16:32.590 回答
1
<a href="{{ path(app.request.get('_route'), {'_locale': 'en'}) }}">English</a>
于 2012-04-04T12:35:40.383 回答